Unhardcoded elemental attribute data.

This commit is contained in:
MobiusDevelopment
2021-10-20 01:25:59 +00:00
parent 20f3d3114d
commit cfc1d03d13
183 changed files with 8703 additions and 6074 deletions

View File

@@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Stone -->
<item id="10521" elemental="FIRE" type="STONE" />
<item id="10522" elemental="WATER" type="STONE" />
<item id="10524" elemental="WIND" type="STONE" />
<item id="10523" elemental="EARTH" type="STONE" />
<item id="10526" elemental="HOLY" type="STONE" />
<item id="10525" elemental="DARK" type="STONE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewel -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Energy -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
<!-- GoD+ Stones -->
<item id="22635" elemental="FIRE" type="STONE" />
<item id="22636" elemental="WATER" type="STONE" />
<item id="22637" elemental="EARTH" type="STONE" />
<item id="22638" elemental="WIND" type="STONE" />
<item id="22639" elemental="DARK" type="STONE" />
<item id="22640" elemental="HOLY" type="STONE" />
<item id="22919" elemental="FIRE" type="STONE" />
<item id="22920" elemental="WATER" type="STONE" />
<item id="22921" elemental="EARTH" type="STONE" />
<item id="22922" elemental="WIND" type="STONE" />
<item id="22923" elemental="DARK" type="STONE" />
<item id="22924" elemental="HOLY" type="STONE" />
<item id="33481" elemental="FIRE" type="STONE_SUPER" />
<item id="33482" elemental="WATER" type="STONE_SUPER" />
<item id="33483" elemental="EARTH" type="STONE_SUPER" />
<item id="33484" elemental="WIND" type="STONE_SUPER" />
<item id="33485" elemental="DARK" type="STONE_SUPER" />
<item id="33486" elemental="HOLY" type="STONE_SUPER" />
<item id="33863" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="33864" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="33865" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="33866" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="33867" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="33868" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="33869" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="33870" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="33871" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="33872" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="33873" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="33874" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34661" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="34662" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="34663" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="34664" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="34665" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="34666" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="34667" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="34668" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="34669" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="34670" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="34671" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="34672" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34790" elemental="FIRE" type="STONE" />
<item id="34791" elemental="WATER" type="STONE" />
<item id="34792" elemental="EARTH" type="STONE" />
<item id="34793" elemental="WIND" type="STONE" />
<item id="34794" elemental="DARK" type="STONE" />
<item id="34795" elemental="HOLY" type="STONE" />
<item id="35729" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="35730" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="35731" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="35732" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="35733" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="35734" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="35735" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="35736" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="35737" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="35738" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="35739" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="35740" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="36960" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="36961" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="36962" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="36963" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="36964" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="36965" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="36966" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="36967" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="36968" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="36969" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="36970" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="36971" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="37499" elemental="FIRE" type="STONE" />
<item id="37500" elemental="WATER" type="STONE" />
<item id="37501" elemental="EARTH" type="STONE" />
<item id="37502" elemental="WIND" type="STONE" />
<item id="37503" elemental="DARK" type="STONE" />
<item id="37504" elemental="HOLY" type="STONE" />
<!-- GoD+ Crystals -->
<item id="22641" elemental="FIRE" type="CRYSTAL" />
<item id="22642" elemental="WATER" type="CRYSTAL" />
<item id="22643" elemental="EARTH" type="CRYSTAL" />
<item id="22644" elemental="WIND" type="CRYSTAL" />
<item id="22645" elemental="DARK" type="CRYSTAL" />
<item id="22646" elemental="HOLY" type="CRYSTAL" />
<item id="22925" elemental="FIRE" type="CRYSTAL" />
<item id="22926" elemental="WATER" type="CRYSTAL" />
<item id="22927" elemental="EARTH" type="CRYSTAL" />
<item id="22928" elemental="WIND" type="CRYSTAL" />
<item id="22929" elemental="DARK" type="CRYSTAL" />
<item id="22930" elemental="HOLY" type="CRYSTAL" />
<item id="33487" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="33488" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="33489" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="33490" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="33491" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="33492" elemental="HOLY" type="CRYSTAL_SUPER" />
<item id="34796" elemental="FIRE" type="CRYSTAL" />
<item id="34797" elemental="WATER" type="CRYSTAL" />
<item id="34798" elemental="EARTH" type="CRYSTAL" />
<item id="34799" elemental="WIND" type="CRYSTAL" />
<item id="34800" elemental="DARK" type="CRYSTAL" />
<item id="34801" elemental="HOLY" type="CRYSTAL" />
<item id="36972" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="36973" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="36974" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="36975" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="36976" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="36977" elemental="HOLY" type="CRYSTAL_SUPER" />
</list>

View File

@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
<xs:attribute type="xs:short" name="power" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -59,6 +59,7 @@ import org.l2jmobius.gameserver.data.xml.ClassListData;
import org.l2jmobius.gameserver.data.xml.CombinationItemsData; import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData; import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -260,6 +261,7 @@ public class GameServer
EnchantItemGroupsData.getInstance(); EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance(); EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance(); EnchantItemOptionsData.getInstance();
ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance(); ItemCrystallizationData.getInstance();
OptionData.getInstance(); OptionData.getInstance();
VariationData.getInstance(); VariationData.getInstance();

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItemHolder> 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();
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItems> 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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType; 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.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest; 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.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId(); final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count); 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 // Armors have the opposite element
if (item.isArmor()) if (item.isArmor())
{ {
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1; return -1;
} }
final boolean success = Elementals.isSuccess(item, stone.getId()); final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success) if (success)
{ {
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false); item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId) public int getLimit(ItemInstance item, int sotneId)
{ {
final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId); final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null) if (elementItem == null)
{ {
return 0; return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon()) 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) 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 (item.isWeapon())
{ {
if (oldValue == 0) 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()) else if (item.isArmor())
{ {
return Elementals.ARMOR_BONUS; return ElementalAttributeData.ARMOR_BONUS;
} }
} }
return 0; return 0;

View File

@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{ {
_itemId = stone.getDisplayId(); _itemId = stone.getDisplayId();
_count = stone.getCount(); _count = stone.getCount();
_atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId)); _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE) if (_atribute == AttributeType.NONE)
{ {
throw new IllegalArgumentException("Undefined Atribute item: " + stone); 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 // Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems()) for (ItemInstance item : player.getInventory().getItems())

View File

@@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Stone -->
<item id="10521" elemental="FIRE" type="STONE" />
<item id="10522" elemental="WATER" type="STONE" />
<item id="10524" elemental="WIND" type="STONE" />
<item id="10523" elemental="EARTH" type="STONE" />
<item id="10526" elemental="HOLY" type="STONE" />
<item id="10525" elemental="DARK" type="STONE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewel -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Energy -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
<!-- GoD+ Stones -->
<item id="22635" elemental="FIRE" type="STONE" />
<item id="22636" elemental="WATER" type="STONE" />
<item id="22637" elemental="EARTH" type="STONE" />
<item id="22638" elemental="WIND" type="STONE" />
<item id="22639" elemental="DARK" type="STONE" />
<item id="22640" elemental="HOLY" type="STONE" />
<item id="22919" elemental="FIRE" type="STONE" />
<item id="22920" elemental="WATER" type="STONE" />
<item id="22921" elemental="EARTH" type="STONE" />
<item id="22922" elemental="WIND" type="STONE" />
<item id="22923" elemental="DARK" type="STONE" />
<item id="22924" elemental="HOLY" type="STONE" />
<item id="33481" elemental="FIRE" type="STONE_SUPER" />
<item id="33482" elemental="WATER" type="STONE_SUPER" />
<item id="33483" elemental="EARTH" type="STONE_SUPER" />
<item id="33484" elemental="WIND" type="STONE_SUPER" />
<item id="33485" elemental="DARK" type="STONE_SUPER" />
<item id="33486" elemental="HOLY" type="STONE_SUPER" />
<item id="33863" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="33864" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="33865" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="33866" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="33867" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="33868" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="33869" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="33870" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="33871" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="33872" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="33873" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="33874" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34661" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="34662" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="34663" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="34664" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="34665" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="34666" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="34667" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="34668" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="34669" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="34670" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="34671" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="34672" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34790" elemental="FIRE" type="STONE" />
<item id="34791" elemental="WATER" type="STONE" />
<item id="34792" elemental="EARTH" type="STONE" />
<item id="34793" elemental="WIND" type="STONE" />
<item id="34794" elemental="DARK" type="STONE" />
<item id="34795" elemental="HOLY" type="STONE" />
<item id="35729" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="35730" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="35731" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="35732" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="35733" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="35734" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="35735" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="35736" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="35737" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="35738" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="35739" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="35740" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="36960" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="36961" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="36962" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="36963" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="36964" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="36965" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="36966" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="36967" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="36968" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="36969" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="36970" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="36971" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="37499" elemental="FIRE" type="STONE" />
<item id="37500" elemental="WATER" type="STONE" />
<item id="37501" elemental="EARTH" type="STONE" />
<item id="37502" elemental="WIND" type="STONE" />
<item id="37503" elemental="DARK" type="STONE" />
<item id="37504" elemental="HOLY" type="STONE" />
<!-- GoD+ Crystals -->
<item id="22641" elemental="FIRE" type="CRYSTAL" />
<item id="22642" elemental="WATER" type="CRYSTAL" />
<item id="22643" elemental="EARTH" type="CRYSTAL" />
<item id="22644" elemental="WIND" type="CRYSTAL" />
<item id="22645" elemental="DARK" type="CRYSTAL" />
<item id="22646" elemental="HOLY" type="CRYSTAL" />
<item id="22925" elemental="FIRE" type="CRYSTAL" />
<item id="22926" elemental="WATER" type="CRYSTAL" />
<item id="22927" elemental="EARTH" type="CRYSTAL" />
<item id="22928" elemental="WIND" type="CRYSTAL" />
<item id="22929" elemental="DARK" type="CRYSTAL" />
<item id="22930" elemental="HOLY" type="CRYSTAL" />
<item id="33487" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="33488" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="33489" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="33490" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="33491" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="33492" elemental="HOLY" type="CRYSTAL_SUPER" />
<item id="34796" elemental="FIRE" type="CRYSTAL" />
<item id="34797" elemental="WATER" type="CRYSTAL" />
<item id="34798" elemental="EARTH" type="CRYSTAL" />
<item id="34799" elemental="WIND" type="CRYSTAL" />
<item id="34800" elemental="DARK" type="CRYSTAL" />
<item id="34801" elemental="HOLY" type="CRYSTAL" />
<item id="36972" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="36973" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="36974" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="36975" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="36976" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="36977" elemental="HOLY" type="CRYSTAL_SUPER" />
</list>

View File

@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
<xs:attribute type="xs:short" name="power" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -61,6 +61,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData; import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -266,6 +267,7 @@ public class GameServer
EnchantItemGroupsData.getInstance(); EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance(); EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance(); EnchantItemOptionsData.getInstance();
ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance(); ItemCrystallizationData.getInstance();
OptionData.getInstance(); OptionData.getInstance();
VariationData.getInstance(); VariationData.getInstance();

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItemHolder> 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();
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItems> 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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType; 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.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest; 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.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId(); final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count); 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 // Armors have the opposite element
if (item.isArmor()) if (item.isArmor())
{ {
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1; return -1;
} }
final boolean success = Elementals.isSuccess(item, stone.getId()); final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success) if (success)
{ {
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false); item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId) public int getLimit(ItemInstance item, int sotneId)
{ {
final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId); final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null) if (elementItem == null)
{ {
return 0; return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon()) 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) 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 (item.isWeapon())
{ {
if (oldValue == 0) 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()) else if (item.isArmor())
{ {
return Elementals.ARMOR_BONUS; return ElementalAttributeData.ARMOR_BONUS;
} }
} }
return 0; return 0;

View File

@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{ {
_itemId = stone.getDisplayId(); _itemId = stone.getDisplayId();
_count = stone.getCount(); _count = stone.getCount();
_atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId)); _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE) if (_atribute == AttributeType.NONE)
{ {
throw new IllegalArgumentException("Undefined Atribute item: " + stone); 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 // Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems()) for (ItemInstance item : player.getInventory().getItems())

View File

@@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Stone -->
<item id="10521" elemental="FIRE" type="STONE" />
<item id="10522" elemental="WATER" type="STONE" />
<item id="10524" elemental="WIND" type="STONE" />
<item id="10523" elemental="EARTH" type="STONE" />
<item id="10526" elemental="HOLY" type="STONE" />
<item id="10525" elemental="DARK" type="STONE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewel -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Energy -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
<!-- GoD+ Stones -->
<item id="22635" elemental="FIRE" type="STONE" />
<item id="22636" elemental="WATER" type="STONE" />
<item id="22637" elemental="EARTH" type="STONE" />
<item id="22638" elemental="WIND" type="STONE" />
<item id="22639" elemental="DARK" type="STONE" />
<item id="22640" elemental="HOLY" type="STONE" />
<item id="22919" elemental="FIRE" type="STONE" />
<item id="22920" elemental="WATER" type="STONE" />
<item id="22921" elemental="EARTH" type="STONE" />
<item id="22922" elemental="WIND" type="STONE" />
<item id="22923" elemental="DARK" type="STONE" />
<item id="22924" elemental="HOLY" type="STONE" />
<item id="33481" elemental="FIRE" type="STONE_SUPER" />
<item id="33482" elemental="WATER" type="STONE_SUPER" />
<item id="33483" elemental="EARTH" type="STONE_SUPER" />
<item id="33484" elemental="WIND" type="STONE_SUPER" />
<item id="33485" elemental="DARK" type="STONE_SUPER" />
<item id="33486" elemental="HOLY" type="STONE_SUPER" />
<item id="33863" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="33864" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="33865" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="33866" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="33867" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="33868" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="33869" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="33870" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="33871" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="33872" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="33873" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="33874" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34661" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="34662" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="34663" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="34664" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="34665" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="34666" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="34667" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="34668" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="34669" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="34670" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="34671" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="34672" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34790" elemental="FIRE" type="STONE" />
<item id="34791" elemental="WATER" type="STONE" />
<item id="34792" elemental="EARTH" type="STONE" />
<item id="34793" elemental="WIND" type="STONE" />
<item id="34794" elemental="DARK" type="STONE" />
<item id="34795" elemental="HOLY" type="STONE" />
<item id="35729" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="35730" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="35731" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="35732" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="35733" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="35734" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="35735" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="35736" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="35737" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="35738" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="35739" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="35740" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="36960" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="36961" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="36962" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="36963" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="36964" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="36965" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="36966" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="36967" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="36968" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="36969" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="36970" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="36971" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="37499" elemental="FIRE" type="STONE" />
<item id="37500" elemental="WATER" type="STONE" />
<item id="37501" elemental="EARTH" type="STONE" />
<item id="37502" elemental="WIND" type="STONE" />
<item id="37503" elemental="DARK" type="STONE" />
<item id="37504" elemental="HOLY" type="STONE" />
<!-- GoD+ Crystals -->
<item id="22641" elemental="FIRE" type="CRYSTAL" />
<item id="22642" elemental="WATER" type="CRYSTAL" />
<item id="22643" elemental="EARTH" type="CRYSTAL" />
<item id="22644" elemental="WIND" type="CRYSTAL" />
<item id="22645" elemental="DARK" type="CRYSTAL" />
<item id="22646" elemental="HOLY" type="CRYSTAL" />
<item id="22925" elemental="FIRE" type="CRYSTAL" />
<item id="22926" elemental="WATER" type="CRYSTAL" />
<item id="22927" elemental="EARTH" type="CRYSTAL" />
<item id="22928" elemental="WIND" type="CRYSTAL" />
<item id="22929" elemental="DARK" type="CRYSTAL" />
<item id="22930" elemental="HOLY" type="CRYSTAL" />
<item id="33487" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="33488" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="33489" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="33490" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="33491" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="33492" elemental="HOLY" type="CRYSTAL_SUPER" />
<item id="34796" elemental="FIRE" type="CRYSTAL" />
<item id="34797" elemental="WATER" type="CRYSTAL" />
<item id="34798" elemental="EARTH" type="CRYSTAL" />
<item id="34799" elemental="WIND" type="CRYSTAL" />
<item id="34800" elemental="DARK" type="CRYSTAL" />
<item id="34801" elemental="HOLY" type="CRYSTAL" />
<item id="36972" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="36973" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="36974" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="36975" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="36976" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="36977" elemental="HOLY" type="CRYSTAL_SUPER" />
</list>

View File

@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
<xs:attribute type="xs:short" name="power" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -61,6 +61,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData; import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -266,6 +267,7 @@ public class GameServer
EnchantItemGroupsData.getInstance(); EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance(); EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance(); EnchantItemOptionsData.getInstance();
ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance(); ItemCrystallizationData.getInstance();
OptionData.getInstance(); OptionData.getInstance();
VariationData.getInstance(); VariationData.getInstance();

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItemHolder> 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();
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItems> 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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType; 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.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest; 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.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId(); final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count); 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 // Armors have the opposite element
if (item.isArmor()) if (item.isArmor())
{ {
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1; return -1;
} }
final boolean success = Elementals.isSuccess(item, stone.getId()); final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success) if (success)
{ {
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false); item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId) public int getLimit(ItemInstance item, int sotneId)
{ {
final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId); final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null) if (elementItem == null)
{ {
return 0; return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon()) 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) 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 (item.isWeapon())
{ {
if (oldValue == 0) 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()) else if (item.isArmor())
{ {
return Elementals.ARMOR_BONUS; return ElementalAttributeData.ARMOR_BONUS;
} }
} }
return 0; return 0;

View File

@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{ {
_itemId = stone.getDisplayId(); _itemId = stone.getDisplayId();
_count = stone.getCount(); _count = stone.getCount();
_atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId)); _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE) if (_atribute == AttributeType.NONE)
{ {
throw new IllegalArgumentException("Undefined Atribute item: " + stone); 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 // Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems()) for (ItemInstance item : player.getInventory().getItems())

View File

@@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Stone -->
<item id="10521" elemental="FIRE" type="STONE" />
<item id="10522" elemental="WATER" type="STONE" />
<item id="10524" elemental="WIND" type="STONE" />
<item id="10523" elemental="EARTH" type="STONE" />
<item id="10526" elemental="HOLY" type="STONE" />
<item id="10525" elemental="DARK" type="STONE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewel -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Energy -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
<!-- GoD+ Stones -->
<item id="22635" elemental="FIRE" type="STONE" />
<item id="22636" elemental="WATER" type="STONE" />
<item id="22637" elemental="EARTH" type="STONE" />
<item id="22638" elemental="WIND" type="STONE" />
<item id="22639" elemental="DARK" type="STONE" />
<item id="22640" elemental="HOLY" type="STONE" />
<item id="22919" elemental="FIRE" type="STONE" />
<item id="22920" elemental="WATER" type="STONE" />
<item id="22921" elemental="EARTH" type="STONE" />
<item id="22922" elemental="WIND" type="STONE" />
<item id="22923" elemental="DARK" type="STONE" />
<item id="22924" elemental="HOLY" type="STONE" />
<item id="33481" elemental="FIRE" type="STONE_SUPER" />
<item id="33482" elemental="WATER" type="STONE_SUPER" />
<item id="33483" elemental="EARTH" type="STONE_SUPER" />
<item id="33484" elemental="WIND" type="STONE_SUPER" />
<item id="33485" elemental="DARK" type="STONE_SUPER" />
<item id="33486" elemental="HOLY" type="STONE_SUPER" />
<item id="33863" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="33864" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="33865" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="33866" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="33867" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="33868" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="33869" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="33870" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="33871" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="33872" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="33873" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="33874" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34661" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="34662" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="34663" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="34664" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="34665" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="34666" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="34667" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="34668" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="34669" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="34670" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="34671" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="34672" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34790" elemental="FIRE" type="STONE" />
<item id="34791" elemental="WATER" type="STONE" />
<item id="34792" elemental="EARTH" type="STONE" />
<item id="34793" elemental="WIND" type="STONE" />
<item id="34794" elemental="DARK" type="STONE" />
<item id="34795" elemental="HOLY" type="STONE" />
<item id="35729" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="35730" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="35731" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="35732" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="35733" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="35734" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="35735" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="35736" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="35737" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="35738" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="35739" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="35740" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="36960" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="36961" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="36962" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="36963" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="36964" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="36965" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="36966" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="36967" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="36968" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="36969" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="36970" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="36971" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="37499" elemental="FIRE" type="STONE" />
<item id="37500" elemental="WATER" type="STONE" />
<item id="37501" elemental="EARTH" type="STONE" />
<item id="37502" elemental="WIND" type="STONE" />
<item id="37503" elemental="DARK" type="STONE" />
<item id="37504" elemental="HOLY" type="STONE" />
<!-- GoD+ Crystals -->
<item id="22641" elemental="FIRE" type="CRYSTAL" />
<item id="22642" elemental="WATER" type="CRYSTAL" />
<item id="22643" elemental="EARTH" type="CRYSTAL" />
<item id="22644" elemental="WIND" type="CRYSTAL" />
<item id="22645" elemental="DARK" type="CRYSTAL" />
<item id="22646" elemental="HOLY" type="CRYSTAL" />
<item id="22925" elemental="FIRE" type="CRYSTAL" />
<item id="22926" elemental="WATER" type="CRYSTAL" />
<item id="22927" elemental="EARTH" type="CRYSTAL" />
<item id="22928" elemental="WIND" type="CRYSTAL" />
<item id="22929" elemental="DARK" type="CRYSTAL" />
<item id="22930" elemental="HOLY" type="CRYSTAL" />
<item id="33487" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="33488" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="33489" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="33490" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="33491" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="33492" elemental="HOLY" type="CRYSTAL_SUPER" />
<item id="34796" elemental="FIRE" type="CRYSTAL" />
<item id="34797" elemental="WATER" type="CRYSTAL" />
<item id="34798" elemental="EARTH" type="CRYSTAL" />
<item id="34799" elemental="WIND" type="CRYSTAL" />
<item id="34800" elemental="DARK" type="CRYSTAL" />
<item id="34801" elemental="HOLY" type="CRYSTAL" />
<item id="36972" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="36973" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="36974" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="36975" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="36976" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="36977" elemental="HOLY" type="CRYSTAL_SUPER" />
</list>

View File

@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
<xs:attribute type="xs:short" name="power" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -60,6 +60,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData; import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -265,6 +266,7 @@ public class GameServer
EnchantItemGroupsData.getInstance(); EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance(); EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance(); EnchantItemOptionsData.getInstance();
ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance(); ItemCrystallizationData.getInstance();
OptionData.getInstance(); OptionData.getInstance();
VariationData.getInstance(); VariationData.getInstance();

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItemHolder> 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();
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItems> 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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType; 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.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest; 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.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -132,7 +133,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId(); final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count); 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 // Armors have the opposite element
if (item.isArmor()) if (item.isArmor())
{ {
@@ -296,7 +297,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1; return -1;
} }
final boolean success = Elementals.isSuccess(item, stone.getId()); final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success) if (success)
{ {
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false); item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -307,7 +308,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId) public int getLimit(ItemInstance item, int sotneId)
{ {
final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId); final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null) if (elementItem == null)
{ {
return 0; return 0;
@@ -315,30 +316,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon()) 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) 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 (item.isWeapon())
{ {
if (oldValue == 0) 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()) else if (item.isArmor())
{ {
return Elementals.ARMOR_BONUS; return ElementalAttributeData.ARMOR_BONUS;
} }
} }
return 0; return 0;

View File

@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{ {
_itemId = stone.getDisplayId(); _itemId = stone.getDisplayId();
_count = stone.getCount(); _count = stone.getCount();
_atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId)); _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE) if (_atribute == AttributeType.NONE)
{ {
throw new IllegalArgumentException("Undefined Atribute item: " + stone); 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 // Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems()) for (ItemInstance item : player.getInventory().getItems())

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Stone -->
<item id="10521" elemental="FIRE" type="STONE" />
<item id="10522" elemental="WATER" type="STONE" />
<item id="10524" elemental="WIND" type="STONE" />
<item id="10523" elemental="EARTH" type="STONE" />
<item id="10526" elemental="HOLY" type="STONE" />
<item id="10525" elemental="DARK" type="STONE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewel -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Energy -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
<!-- GoD+ Stones -->
<item id="22635" elemental="FIRE" type="STONE" />
<item id="22636" elemental="WATER" type="STONE" />
<item id="22637" elemental="EARTH" type="STONE" />
<item id="22638" elemental="WIND" type="STONE" />
<item id="22639" elemental="DARK" type="STONE" />
<item id="22640" elemental="HOLY" type="STONE" />
<item id="22919" elemental="FIRE" type="STONE" />
<item id="22920" elemental="WATER" type="STONE" />
<item id="22921" elemental="EARTH" type="STONE" />
<item id="22922" elemental="WIND" type="STONE" />
<item id="22923" elemental="DARK" type="STONE" />
<item id="22924" elemental="HOLY" type="STONE" />
<item id="33481" elemental="FIRE" type="STONE_SUPER" />
<item id="33482" elemental="WATER" type="STONE_SUPER" />
<item id="33483" elemental="EARTH" type="STONE_SUPER" />
<item id="33484" elemental="WIND" type="STONE_SUPER" />
<item id="33485" elemental="DARK" type="STONE_SUPER" />
<item id="33486" elemental="HOLY" type="STONE_SUPER" />
<item id="33863" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="33864" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="33865" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="33866" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="33867" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="33868" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="33869" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="33870" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="33871" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="33872" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="33873" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="33874" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34661" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="34662" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="34663" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="34664" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="34665" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="34666" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="34667" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="34668" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="34669" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="34670" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="34671" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="34672" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34790" elemental="FIRE" type="STONE" />
<item id="34791" elemental="WATER" type="STONE" />
<item id="34792" elemental="EARTH" type="STONE" />
<item id="34793" elemental="WIND" type="STONE" />
<item id="34794" elemental="DARK" type="STONE" />
<item id="34795" elemental="HOLY" type="STONE" />
<item id="35729" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="35730" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="35731" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="35732" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="35733" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="35734" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="35735" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="35736" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="35737" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="35738" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="35739" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="35740" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="36960" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="36961" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="36962" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="36963" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="36964" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="36965" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="36966" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="36967" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="36968" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="36969" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="36970" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="36971" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="37499" elemental="FIRE" type="STONE" />
<item id="37500" elemental="WATER" type="STONE" />
<item id="37501" elemental="EARTH" type="STONE" />
<item id="37502" elemental="WIND" type="STONE" />
<item id="37503" elemental="DARK" type="STONE" />
<item id="37504" elemental="HOLY" type="STONE" />
<!-- GoD+ Crystals -->
<item id="22641" elemental="FIRE" type="CRYSTAL" />
<item id="22642" elemental="WATER" type="CRYSTAL" />
<item id="22643" elemental="EARTH" type="CRYSTAL" />
<item id="22644" elemental="WIND" type="CRYSTAL" />
<item id="22645" elemental="DARK" type="CRYSTAL" />
<item id="22646" elemental="HOLY" type="CRYSTAL" />
<item id="22925" elemental="FIRE" type="CRYSTAL" />
<item id="22926" elemental="WATER" type="CRYSTAL" />
<item id="22927" elemental="EARTH" type="CRYSTAL" />
<item id="22928" elemental="WIND" type="CRYSTAL" />
<item id="22929" elemental="DARK" type="CRYSTAL" />
<item id="22930" elemental="HOLY" type="CRYSTAL" />
<item id="33487" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="33488" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="33489" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="33490" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="33491" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="33492" elemental="HOLY" type="CRYSTAL_SUPER" />
<item id="34796" elemental="FIRE" type="CRYSTAL" />
<item id="34797" elemental="WATER" type="CRYSTAL" />
<item id="34798" elemental="EARTH" type="CRYSTAL" />
<item id="34799" elemental="WIND" type="CRYSTAL" />
<item id="34800" elemental="DARK" type="CRYSTAL" />
<item id="34801" elemental="HOLY" type="CRYSTAL" />
<item id="36972" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="36973" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="36974" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="36975" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="36976" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="36977" elemental="HOLY" type="CRYSTAL_SUPER" />
<!-- Attribute Practice Fire Stone -->
<item id="48169" elemental="FIRE" type="STONE" />
</list>

View File

@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
<xs:attribute type="xs:short" name="power" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -62,6 +62,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData; import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -266,6 +267,7 @@ public class GameServer
EnchantItemGroupsData.getInstance(); EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance(); EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance(); EnchantItemOptionsData.getInstance();
ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance(); ItemCrystallizationData.getInstance();
OptionData.getInstance(); OptionData.getInstance();
VariationData.getInstance(); VariationData.getInstance();

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItemHolder> 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();
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItems> 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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType; 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.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest; 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.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId(); final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count); 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 // Armors have the opposite element
if (item.isArmor()) if (item.isArmor())
{ {
@@ -304,7 +305,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1; return -1;
} }
final boolean success = Elementals.isSuccess(item, stone.getId()); final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success) if (success)
{ {
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false); item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -315,7 +316,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId) public int getLimit(ItemInstance item, int sotneId)
{ {
final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId); final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null) if (elementItem == null)
{ {
return 0; return 0;
@@ -323,30 +324,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon()) 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) 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 (item.isWeapon())
{ {
if (oldValue == 0) 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()) else if (item.isArmor())
{ {
return Elementals.ARMOR_BONUS; return ElementalAttributeData.ARMOR_BONUS;
} }
} }
return 0; return 0;

View File

@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{ {
_itemId = stone.getDisplayId(); _itemId = stone.getDisplayId();
_count = stone.getCount(); _count = stone.getCount();
_atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId)); _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE) if (_atribute == AttributeType.NONE)
{ {
throw new IllegalArgumentException("Undefined Atribute item: " + stone); 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 // Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems()) for (ItemInstance item : player.getInventory().getItems())

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Stone -->
<item id="10521" elemental="FIRE" type="STONE" />
<item id="10522" elemental="WATER" type="STONE" />
<item id="10524" elemental="WIND" type="STONE" />
<item id="10523" elemental="EARTH" type="STONE" />
<item id="10526" elemental="HOLY" type="STONE" />
<item id="10525" elemental="DARK" type="STONE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewel -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Energy -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
<!-- GoD+ Stones -->
<item id="22635" elemental="FIRE" type="STONE" />
<item id="22636" elemental="WATER" type="STONE" />
<item id="22637" elemental="EARTH" type="STONE" />
<item id="22638" elemental="WIND" type="STONE" />
<item id="22639" elemental="DARK" type="STONE" />
<item id="22640" elemental="HOLY" type="STONE" />
<item id="22919" elemental="FIRE" type="STONE" />
<item id="22920" elemental="WATER" type="STONE" />
<item id="22921" elemental="EARTH" type="STONE" />
<item id="22922" elemental="WIND" type="STONE" />
<item id="22923" elemental="DARK" type="STONE" />
<item id="22924" elemental="HOLY" type="STONE" />
<item id="33481" elemental="FIRE" type="STONE_SUPER" />
<item id="33482" elemental="WATER" type="STONE_SUPER" />
<item id="33483" elemental="EARTH" type="STONE_SUPER" />
<item id="33484" elemental="WIND" type="STONE_SUPER" />
<item id="33485" elemental="DARK" type="STONE_SUPER" />
<item id="33486" elemental="HOLY" type="STONE_SUPER" />
<item id="33863" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="33864" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="33865" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="33866" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="33867" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="33868" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="33869" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="33870" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="33871" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="33872" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="33873" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="33874" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34661" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="34662" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="34663" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="34664" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="34665" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="34666" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="34667" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="34668" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="34669" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="34670" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="34671" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="34672" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34790" elemental="FIRE" type="STONE" />
<item id="34791" elemental="WATER" type="STONE" />
<item id="34792" elemental="EARTH" type="STONE" />
<item id="34793" elemental="WIND" type="STONE" />
<item id="34794" elemental="DARK" type="STONE" />
<item id="34795" elemental="HOLY" type="STONE" />
<item id="35729" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="35730" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="35731" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="35732" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="35733" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="35734" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="35735" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="35736" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="35737" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="35738" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="35739" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="35740" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="36960" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="36961" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="36962" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="36963" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="36964" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="36965" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="36966" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="36967" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="36968" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="36969" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="36970" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="36971" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="37499" elemental="FIRE" type="STONE" />
<item id="37500" elemental="WATER" type="STONE" />
<item id="37501" elemental="EARTH" type="STONE" />
<item id="37502" elemental="WIND" type="STONE" />
<item id="37503" elemental="DARK" type="STONE" />
<item id="37504" elemental="HOLY" type="STONE" />
<!-- GoD+ Crystals -->
<item id="22641" elemental="FIRE" type="CRYSTAL" />
<item id="22642" elemental="WATER" type="CRYSTAL" />
<item id="22643" elemental="EARTH" type="CRYSTAL" />
<item id="22644" elemental="WIND" type="CRYSTAL" />
<item id="22645" elemental="DARK" type="CRYSTAL" />
<item id="22646" elemental="HOLY" type="CRYSTAL" />
<item id="22925" elemental="FIRE" type="CRYSTAL" />
<item id="22926" elemental="WATER" type="CRYSTAL" />
<item id="22927" elemental="EARTH" type="CRYSTAL" />
<item id="22928" elemental="WIND" type="CRYSTAL" />
<item id="22929" elemental="DARK" type="CRYSTAL" />
<item id="22930" elemental="HOLY" type="CRYSTAL" />
<item id="33487" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="33488" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="33489" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="33490" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="33491" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="33492" elemental="HOLY" type="CRYSTAL_SUPER" />
<item id="34796" elemental="FIRE" type="CRYSTAL" />
<item id="34797" elemental="WATER" type="CRYSTAL" />
<item id="34798" elemental="EARTH" type="CRYSTAL" />
<item id="34799" elemental="WIND" type="CRYSTAL" />
<item id="34800" elemental="DARK" type="CRYSTAL" />
<item id="34801" elemental="HOLY" type="CRYSTAL" />
<item id="36972" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="36973" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="36974" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="36975" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="36976" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="36977" elemental="HOLY" type="CRYSTAL_SUPER" />
<!-- Attribute Practice Fire Stone -->
<item id="48169" elemental="FIRE" type="STONE" />
</list>

View File

@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
<xs:attribute type="xs:short" name="power" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -62,6 +62,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData; import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -266,6 +267,7 @@ public class GameServer
EnchantItemGroupsData.getInstance(); EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance(); EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance(); EnchantItemOptionsData.getInstance();
ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance(); ItemCrystallizationData.getInstance();
OptionData.getInstance(); OptionData.getInstance();
VariationData.getInstance(); VariationData.getInstance();

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItemHolder> 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();
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItems> 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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType; 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.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest; 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.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId(); final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count); 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 // Armors have the opposite element
if (item.isArmor()) if (item.isArmor())
{ {
@@ -304,7 +305,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return -1; return -1;
} }
final boolean success = Elementals.isSuccess(item, stone.getId()); final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success) if (success)
{ {
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false); item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -315,7 +316,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId) public int getLimit(ItemInstance item, int sotneId)
{ {
final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId); final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null) if (elementItem == null)
{ {
return 0; return 0;
@@ -323,30 +324,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon()) 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) 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 (item.isWeapon())
{ {
if (oldValue == 0) 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()) else if (item.isArmor())
{ {
return Elementals.ARMOR_BONUS; return ElementalAttributeData.ARMOR_BONUS;
} }
} }
return 0; return 0;

View File

@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,12 +41,12 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{ {
_itemId = stone.getDisplayId(); _itemId = stone.getDisplayId();
_count = stone.getCount(); _count = stone.getCount();
_atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId)); _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE) if (_atribute == AttributeType.NONE)
{ {
throw new IllegalArgumentException("Undefined Atribute item: " + stone); 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 // Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems()) for (ItemInstance item : player.getInventory().getItems())

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Stone -->
<item id="10521" elemental="FIRE" type="STONE" />
<item id="10522" elemental="WATER" type="STONE" />
<item id="10524" elemental="WIND" type="STONE" />
<item id="10523" elemental="EARTH" type="STONE" />
<item id="10526" elemental="HOLY" type="STONE" />
<item id="10525" elemental="DARK" type="STONE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewels are only for R110 grade -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Energy -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
<!-- GoD+ Stones -->
<item id="22635" elemental="FIRE" type="STONE" />
<item id="22636" elemental="WATER" type="STONE" />
<item id="22637" elemental="EARTH" type="STONE" />
<item id="22638" elemental="WIND" type="STONE" />
<item id="22639" elemental="DARK" type="STONE" />
<item id="22640" elemental="HOLY" type="STONE" />
<item id="22919" elemental="FIRE" type="STONE" />
<item id="22920" elemental="WATER" type="STONE" />
<item id="22921" elemental="EARTH" type="STONE" />
<item id="22922" elemental="WIND" type="STONE" />
<item id="22923" elemental="DARK" type="STONE" />
<item id="22924" elemental="HOLY" type="STONE" />
<item id="33481" elemental="FIRE" type="STONE_SUPER" />
<item id="33482" elemental="WATER" type="STONE_SUPER" />
<item id="33483" elemental="EARTH" type="STONE_SUPER" />
<item id="33484" elemental="WIND" type="STONE_SUPER" />
<item id="33485" elemental="DARK" type="STONE_SUPER" />
<item id="33486" elemental="HOLY" type="STONE_SUPER" />
<item id="33863" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="33864" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="33865" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="33866" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="33867" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="33868" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="33869" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="33870" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="33871" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="33872" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="33873" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="33874" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34661" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="34662" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="34663" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="34664" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="34665" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="34666" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="34667" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="34668" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="34669" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="34670" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="34671" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="34672" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34790" elemental="FIRE" type="STONE" />
<item id="34791" elemental="WATER" type="STONE" />
<item id="34792" elemental="EARTH" type="STONE" />
<item id="34793" elemental="WIND" type="STONE" />
<item id="34794" elemental="DARK" type="STONE" />
<item id="34795" elemental="HOLY" type="STONE" />
<item id="35729" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="35730" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="35731" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="35732" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="35733" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="35734" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="35735" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="35736" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="35737" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="35738" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="35739" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="35740" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="36960" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="36961" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="36962" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="36963" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="36964" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="36965" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="36966" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="36967" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="36968" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="36969" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="36970" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="36971" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="37499" elemental="FIRE" type="STONE" />
<item id="37500" elemental="WATER" type="STONE" />
<item id="37501" elemental="EARTH" type="STONE" />
<item id="37502" elemental="WIND" type="STONE" />
<item id="37503" elemental="DARK" type="STONE" />
<item id="37504" elemental="HOLY" type="STONE" />
<!-- GoD+ Crystals -->
<item id="22641" elemental="FIRE" type="CRYSTAL" />
<item id="22642" elemental="WATER" type="CRYSTAL" />
<item id="22643" elemental="EARTH" type="CRYSTAL" />
<item id="22644" elemental="WIND" type="CRYSTAL" />
<item id="22645" elemental="DARK" type="CRYSTAL" />
<item id="22646" elemental="HOLY" type="CRYSTAL" />
<item id="22925" elemental="FIRE" type="CRYSTAL" />
<item id="22926" elemental="WATER" type="CRYSTAL" />
<item id="22927" elemental="EARTH" type="CRYSTAL" />
<item id="22928" elemental="WIND" type="CRYSTAL" />
<item id="22929" elemental="DARK" type="CRYSTAL" />
<item id="22930" elemental="HOLY" type="CRYSTAL" />
<item id="33487" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="33488" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="33489" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="33490" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="33491" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="33492" elemental="HOLY" type="CRYSTAL_SUPER" />
<item id="34796" elemental="FIRE" type="CRYSTAL" />
<item id="34797" elemental="WATER" type="CRYSTAL" />
<item id="34798" elemental="EARTH" type="CRYSTAL" />
<item id="34799" elemental="WIND" type="CRYSTAL" />
<item id="34800" elemental="DARK" type="CRYSTAL" />
<item id="34801" elemental="HOLY" type="CRYSTAL" />
<item id="36972" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="36973" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="36974" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="36975" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="36976" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="36977" elemental="HOLY" type="CRYSTAL_SUPER" />
<!-- Attribute Practice Fire Stone -->
<item id="48169" elemental="FIRE" type="STONE" />
</list>

View File

@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
<xs:attribute type="xs:short" name="power" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -62,6 +62,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData; import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -267,6 +268,7 @@ public class GameServer
EnchantItemGroupsData.getInstance(); EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance(); EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance(); EnchantItemOptionsData.getInstance();
ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance(); ItemCrystallizationData.getInstance();
OptionData.getInstance(); OptionData.getInstance();
VariationData.getInstance(); VariationData.getInstance();

View File

@@ -14,34 +14,31 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.data.xml;
import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.l2jmobius.Config; import org.w3c.dom.Document;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
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<Integer, ElementalItems> TABLE = new HashMap<>(); private static final Map<Integer, ElementalItemHolder> ELEMENTAL_ITEMS = 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 FIRST_WEAPON_BONUS = 20;
public static final int NEXT_WEAPON_BONUS = 5; 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.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.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.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 */ /* @formatter:on */
public enum ElementalItemType protected ElementalAttributeData()
{ {
Stone(3), load();
StoneSuper(3),
Crystal(6),
CrystalSuper(6),
Jewel(9),
Energy(12);
public int _maxLevel;
ElementalItemType(int maxLevel)
{
_maxLevel = maxLevel;
}
} }
public enum ElementalItems @Override
public void load()
{ {
fireStone(FIRE, 9546, ElementalItemType.Stone, 0), ELEMENTAL_ITEMS.clear();
waterStone(WATER, 9547, ElementalItemType.Stone, 0), parseDatapackFile("data/ElementalAttributeData.xml");
windStone(WIND, 9549, ElementalItemType.Stone, 0), LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
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) @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) 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) if (item != null)
{ {
return item._type._maxLevel; return item.getType().getMaxLevel();
} }
return -1; 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 row = -1;
int column = -1; int column = -1;
@@ -226,31 +202,36 @@ public class Elementals
row = 5; row = 5;
break; 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; column = item.isWeapon() ? 0 : 1;
break; break;
} }
case Crystal: case CRYSTAL:
{ {
column = item.isWeapon() ? 2 : 3; column = item.isWeapon() ? 2 : 3;
break; break;
} }
case StoneSuper: case STONE_SUPER:
{ {
column = item.isWeapon() ? 4 : 5; column = item.isWeapon() ? 4 : 5;
break; break;
} }
case CrystalSuper: case CRYSTAL_SUPER:
{ {
column = item.isWeapon() ? 6 : 7; column = item.isWeapon() ? 6 : 7;
break; break;
} }
case Jewel: case JEWEL:
{ {
column = item.isWeapon() ? 8 : 9; column = item.isWeapon() ? 8 : 9;
break; break;
@@ -262,4 +243,14 @@ public class Elementals
} }
return true; return true;
} }
public static ElementalAttributeData getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
}
} }

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItems> 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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType; 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.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest; 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.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -111,7 +112,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return; 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); client.sendPacket(SystemMessageId.ELEMENTAL_POWER_ENHANCER_USAGE_REQUIREMENT_IS_NOT_SUFFICIENT);
player.removeRequest(request.getClass()); player.removeRequest(request.getClass());
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId(); final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count); 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 // Armors have the opposite element
if (item.isArmor()) if (item.isArmor())
{ {
@@ -303,7 +304,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
player.removeRequest(EnchantItemAttributeRequest.class); player.removeRequest(EnchantItemAttributeRequest.class);
return -1; return -1;
} }
final boolean success = Elementals.isSuccess(item, stone.getId()); final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success) if (success)
{ {
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false); item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -314,7 +315,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId) public int getLimit(ItemInstance item, int sotneId)
{ {
final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId); final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null) if (elementItem == null)
{ {
return 0; return 0;
@@ -322,30 +323,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon()) 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) 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 (item.isWeapon())
{ {
if (oldValue == 0) 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()) else if (item.isArmor())
{ {
return Elementals.ARMOR_BONUS; return ElementalAttributeData.ARMOR_BONUS;
} }
} }
return 0; return 0;

View File

@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,17 +41,17 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{ {
_itemId = stone.getDisplayId(); _itemId = stone.getDisplayId();
_count = stone.getCount(); _count = stone.getCount();
_atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId)); _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE) if (_atribute == AttributeType.NONE)
{ {
throw new IllegalArgumentException("Undefined Atribute item: " + stone); 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 // Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems()) for (ItemInstance item : player.getInventory().getItems())
{ {
if (Elementals.isElementableWithStone(item, stone.getId())) if (ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getId()))
{ {
_items.add(item.getObjectId()); _items.add(item.getObjectId());
} }

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Stone -->
<item id="10521" elemental="FIRE" type="STONE" />
<item id="10522" elemental="WATER" type="STONE" />
<item id="10524" elemental="WIND" type="STONE" />
<item id="10523" elemental="EARTH" type="STONE" />
<item id="10526" elemental="HOLY" type="STONE" />
<item id="10525" elemental="DARK" type="STONE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewels are only for R110 grade -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Energy -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
<!-- GoD+ Stones -->
<item id="22635" elemental="FIRE" type="STONE" />
<item id="22636" elemental="WATER" type="STONE" />
<item id="22637" elemental="EARTH" type="STONE" />
<item id="22638" elemental="WIND" type="STONE" />
<item id="22639" elemental="DARK" type="STONE" />
<item id="22640" elemental="HOLY" type="STONE" />
<item id="22919" elemental="FIRE" type="STONE" />
<item id="22920" elemental="WATER" type="STONE" />
<item id="22921" elemental="EARTH" type="STONE" />
<item id="22922" elemental="WIND" type="STONE" />
<item id="22923" elemental="DARK" type="STONE" />
<item id="22924" elemental="HOLY" type="STONE" />
<item id="33481" elemental="FIRE" type="STONE_SUPER" />
<item id="33482" elemental="WATER" type="STONE_SUPER" />
<item id="33483" elemental="EARTH" type="STONE_SUPER" />
<item id="33484" elemental="WIND" type="STONE_SUPER" />
<item id="33485" elemental="DARK" type="STONE_SUPER" />
<item id="33486" elemental="HOLY" type="STONE_SUPER" />
<item id="33863" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="33864" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="33865" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="33866" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="33867" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="33868" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="33869" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="33870" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="33871" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="33872" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="33873" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="33874" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34661" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="34662" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="34663" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="34664" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="34665" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="34666" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="34667" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="34668" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="34669" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="34670" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="34671" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="34672" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34790" elemental="FIRE" type="STONE" />
<item id="34791" elemental="WATER" type="STONE" />
<item id="34792" elemental="EARTH" type="STONE" />
<item id="34793" elemental="WIND" type="STONE" />
<item id="34794" elemental="DARK" type="STONE" />
<item id="34795" elemental="HOLY" type="STONE" />
<item id="35729" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="35730" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="35731" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="35732" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="35733" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="35734" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="35735" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="35736" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="35737" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="35738" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="35739" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="35740" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="36960" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="36961" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="36962" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="36963" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="36964" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="36965" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="36966" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="36967" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="36968" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="36969" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="36970" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="36971" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="37499" elemental="FIRE" type="STONE" />
<item id="37500" elemental="WATER" type="STONE" />
<item id="37501" elemental="EARTH" type="STONE" />
<item id="37502" elemental="WIND" type="STONE" />
<item id="37503" elemental="DARK" type="STONE" />
<item id="37504" elemental="HOLY" type="STONE" />
<!-- GoD+ Crystals -->
<item id="22641" elemental="FIRE" type="CRYSTAL" />
<item id="22642" elemental="WATER" type="CRYSTAL" />
<item id="22643" elemental="EARTH" type="CRYSTAL" />
<item id="22644" elemental="WIND" type="CRYSTAL" />
<item id="22645" elemental="DARK" type="CRYSTAL" />
<item id="22646" elemental="HOLY" type="CRYSTAL" />
<item id="22925" elemental="FIRE" type="CRYSTAL" />
<item id="22926" elemental="WATER" type="CRYSTAL" />
<item id="22927" elemental="EARTH" type="CRYSTAL" />
<item id="22928" elemental="WIND" type="CRYSTAL" />
<item id="22929" elemental="DARK" type="CRYSTAL" />
<item id="22930" elemental="HOLY" type="CRYSTAL" />
<item id="33487" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="33488" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="33489" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="33490" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="33491" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="33492" elemental="HOLY" type="CRYSTAL_SUPER" />
<item id="34796" elemental="FIRE" type="CRYSTAL" />
<item id="34797" elemental="WATER" type="CRYSTAL" />
<item id="34798" elemental="EARTH" type="CRYSTAL" />
<item id="34799" elemental="WIND" type="CRYSTAL" />
<item id="34800" elemental="DARK" type="CRYSTAL" />
<item id="34801" elemental="HOLY" type="CRYSTAL" />
<item id="36972" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="36973" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="36974" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="36975" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="36976" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="36977" elemental="HOLY" type="CRYSTAL_SUPER" />
<!-- Attribute Practice Fire Stone -->
<item id="48169" elemental="FIRE" type="STONE" />
</list>

View File

@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
<xs:attribute type="xs:short" name="power" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -62,6 +62,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData; import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -270,6 +271,7 @@ public class GameServer
EnchantItemGroupsData.getInstance(); EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance(); EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance(); EnchantItemOptionsData.getInstance();
ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance(); ItemCrystallizationData.getInstance();
OptionData.getInstance(); OptionData.getInstance();
VariationData.getInstance(); VariationData.getInstance();

View File

@@ -14,34 +14,31 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.data.xml;
import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.l2jmobius.Config; import org.w3c.dom.Document;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
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<Integer, ElementalItems> TABLE = new HashMap<>(); private static final Map<Integer, ElementalItemHolder> ELEMENTAL_ITEMS = 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 FIRST_WEAPON_BONUS = 20;
public static final int NEXT_WEAPON_BONUS = 5; 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.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.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.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 */ /* @formatter:on */
public enum ElementalItemType protected ElementalAttributeData()
{ {
Stone(3), load();
StoneSuper(3),
Crystal(6),
CrystalSuper(6),
Jewel(9),
Energy(12);
public int _maxLevel;
ElementalItemType(int maxLevel)
{
_maxLevel = maxLevel;
}
} }
public enum ElementalItems @Override
public void load()
{ {
fireStone(FIRE, 9546, ElementalItemType.Stone, 0), ELEMENTAL_ITEMS.clear();
waterStone(WATER, 9547, ElementalItemType.Stone, 0), parseDatapackFile("data/ElementalAttributeData.xml");
windStone(WIND, 9549, ElementalItemType.Stone, 0), LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
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) @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) 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) if (item != null)
{ {
return item._type._maxLevel; return item.getType().getMaxLevel();
} }
return -1; 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 row = -1;
int column = -1; int column = -1;
@@ -226,31 +202,36 @@ public class Elementals
row = 5; row = 5;
break; 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; column = item.isWeapon() ? 0 : 1;
break; break;
} }
case Crystal: case CRYSTAL:
{ {
column = item.isWeapon() ? 2 : 3; column = item.isWeapon() ? 2 : 3;
break; break;
} }
case StoneSuper: case STONE_SUPER:
{ {
column = item.isWeapon() ? 4 : 5; column = item.isWeapon() ? 4 : 5;
break; break;
} }
case CrystalSuper: case CRYSTAL_SUPER:
{ {
column = item.isWeapon() ? 6 : 7; column = item.isWeapon() ? 6 : 7;
break; break;
} }
case Jewel: case JEWEL:
{ {
column = item.isWeapon() ? 8 : 9; column = item.isWeapon() ? 8 : 9;
break; break;
@@ -262,4 +243,14 @@ public class Elementals
} }
return true; return true;
} }
public static ElementalAttributeData getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
}
} }

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItems> 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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType; 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.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest; 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.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -111,7 +112,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return; 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); client.sendPacket(SystemMessageId.ELEMENTAL_POWER_ENHANCER_USAGE_REQUIREMENT_IS_NOT_SUFFICIENT);
player.removeRequest(request.getClass()); player.removeRequest(request.getClass());
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId(); final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count); 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 // Armors have the opposite element
if (item.isArmor()) if (item.isArmor())
{ {
@@ -303,7 +304,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
player.removeRequest(EnchantItemAttributeRequest.class); player.removeRequest(EnchantItemAttributeRequest.class);
return -1; return -1;
} }
final boolean success = Elementals.isSuccess(item, stone.getId()); final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success) if (success)
{ {
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false); item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -314,7 +315,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId) public int getLimit(ItemInstance item, int sotneId)
{ {
final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId); final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null) if (elementItem == null)
{ {
return 0; return 0;
@@ -322,30 +323,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon()) 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) 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 (item.isWeapon())
{ {
if (oldValue == 0) 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()) else if (item.isArmor())
{ {
return Elementals.ARMOR_BONUS; return ElementalAttributeData.ARMOR_BONUS;
} }
} }
return 0; return 0;

View File

@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,17 +41,17 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{ {
_itemId = stone.getDisplayId(); _itemId = stone.getDisplayId();
_count = stone.getCount(); _count = stone.getCount();
_atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId)); _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE) if (_atribute == AttributeType.NONE)
{ {
throw new IllegalArgumentException("Undefined Atribute item: " + stone); 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 // Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems()) for (ItemInstance item : player.getInventory().getItems())
{ {
if (Elementals.isElementableWithStone(item, stone.getId())) if (ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getId()))
{ {
_items.add(item.getObjectId()); _items.add(item.getObjectId());
} }

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Stone -->
<item id="10521" elemental="FIRE" type="STONE" />
<item id="10522" elemental="WATER" type="STONE" />
<item id="10524" elemental="WIND" type="STONE" />
<item id="10523" elemental="EARTH" type="STONE" />
<item id="10526" elemental="HOLY" type="STONE" />
<item id="10525" elemental="DARK" type="STONE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewels are only for R110 grade -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Energy -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
<!-- GoD+ Stones -->
<item id="22635" elemental="FIRE" type="STONE" />
<item id="22636" elemental="WATER" type="STONE" />
<item id="22637" elemental="EARTH" type="STONE" />
<item id="22638" elemental="WIND" type="STONE" />
<item id="22639" elemental="DARK" type="STONE" />
<item id="22640" elemental="HOLY" type="STONE" />
<item id="22919" elemental="FIRE" type="STONE" />
<item id="22920" elemental="WATER" type="STONE" />
<item id="22921" elemental="EARTH" type="STONE" />
<item id="22922" elemental="WIND" type="STONE" />
<item id="22923" elemental="DARK" type="STONE" />
<item id="22924" elemental="HOLY" type="STONE" />
<item id="33481" elemental="FIRE" type="STONE_SUPER" />
<item id="33482" elemental="WATER" type="STONE_SUPER" />
<item id="33483" elemental="EARTH" type="STONE_SUPER" />
<item id="33484" elemental="WIND" type="STONE_SUPER" />
<item id="33485" elemental="DARK" type="STONE_SUPER" />
<item id="33486" elemental="HOLY" type="STONE_SUPER" />
<item id="33863" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="33864" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="33865" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="33866" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="33867" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="33868" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="33869" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="33870" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="33871" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="33872" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="33873" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="33874" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34661" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="34662" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="34663" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="34664" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="34665" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="34666" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="34667" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="34668" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="34669" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="34670" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="34671" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="34672" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34790" elemental="FIRE" type="STONE" />
<item id="34791" elemental="WATER" type="STONE" />
<item id="34792" elemental="EARTH" type="STONE" />
<item id="34793" elemental="WIND" type="STONE" />
<item id="34794" elemental="DARK" type="STONE" />
<item id="34795" elemental="HOLY" type="STONE" />
<item id="35729" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="35730" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="35731" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="35732" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="35733" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="35734" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="35735" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="35736" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="35737" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="35738" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="35739" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="35740" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="36960" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="36961" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="36962" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="36963" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="36964" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="36965" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="36966" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="36967" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="36968" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="36969" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="36970" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="36971" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="37499" elemental="FIRE" type="STONE" />
<item id="37500" elemental="WATER" type="STONE" />
<item id="37501" elemental="EARTH" type="STONE" />
<item id="37502" elemental="WIND" type="STONE" />
<item id="37503" elemental="DARK" type="STONE" />
<item id="37504" elemental="HOLY" type="STONE" />
<!-- GoD+ Crystals -->
<item id="22641" elemental="FIRE" type="CRYSTAL" />
<item id="22642" elemental="WATER" type="CRYSTAL" />
<item id="22643" elemental="EARTH" type="CRYSTAL" />
<item id="22644" elemental="WIND" type="CRYSTAL" />
<item id="22645" elemental="DARK" type="CRYSTAL" />
<item id="22646" elemental="HOLY" type="CRYSTAL" />
<item id="22925" elemental="FIRE" type="CRYSTAL" />
<item id="22926" elemental="WATER" type="CRYSTAL" />
<item id="22927" elemental="EARTH" type="CRYSTAL" />
<item id="22928" elemental="WIND" type="CRYSTAL" />
<item id="22929" elemental="DARK" type="CRYSTAL" />
<item id="22930" elemental="HOLY" type="CRYSTAL" />
<item id="33487" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="33488" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="33489" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="33490" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="33491" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="33492" elemental="HOLY" type="CRYSTAL_SUPER" />
<item id="34796" elemental="FIRE" type="CRYSTAL" />
<item id="34797" elemental="WATER" type="CRYSTAL" />
<item id="34798" elemental="EARTH" type="CRYSTAL" />
<item id="34799" elemental="WIND" type="CRYSTAL" />
<item id="34800" elemental="DARK" type="CRYSTAL" />
<item id="34801" elemental="HOLY" type="CRYSTAL" />
<item id="36972" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="36973" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="36974" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="36975" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="36976" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="36977" elemental="HOLY" type="CRYSTAL_SUPER" />
<!-- Attribute Practice Fire Stone -->
<item id="48169" elemental="FIRE" type="STONE" />
</list>

View File

@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
<xs:attribute type="xs:short" name="power" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -62,6 +62,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData; import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -270,6 +271,7 @@ public class GameServer
EnchantItemGroupsData.getInstance(); EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance(); EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance(); EnchantItemOptionsData.getInstance();
ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance(); ItemCrystallizationData.getInstance();
OptionData.getInstance(); OptionData.getInstance();
VariationData.getInstance(); VariationData.getInstance();

View File

@@ -14,34 +14,31 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.data.xml;
import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.l2jmobius.Config; import org.w3c.dom.Document;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
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<Integer, ElementalItems> TABLE = new HashMap<>(); private static final Map<Integer, ElementalItemHolder> ELEMENTAL_ITEMS = 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 FIRST_WEAPON_BONUS = 20;
public static final int NEXT_WEAPON_BONUS = 5; 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.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.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.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 */ /* @formatter:on */
public enum ElementalItemType protected ElementalAttributeData()
{ {
Stone(3), load();
StoneSuper(3),
Crystal(6),
CrystalSuper(6),
Jewel(9),
Energy(12);
public int _maxLevel;
ElementalItemType(int maxLevel)
{
_maxLevel = maxLevel;
}
} }
public enum ElementalItems @Override
public void load()
{ {
fireStone(FIRE, 9546, ElementalItemType.Stone, 0), ELEMENTAL_ITEMS.clear();
waterStone(WATER, 9547, ElementalItemType.Stone, 0), parseDatapackFile("data/ElementalAttributeData.xml");
windStone(WIND, 9549, ElementalItemType.Stone, 0), LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
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) @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) 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) if (item != null)
{ {
return item._type._maxLevel; return item.getType().getMaxLevel();
} }
return -1; 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 row = -1;
int column = -1; int column = -1;
@@ -226,31 +202,36 @@ public class Elementals
row = 5; row = 5;
break; 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; column = item.isWeapon() ? 0 : 1;
break; break;
} }
case Crystal: case CRYSTAL:
{ {
column = item.isWeapon() ? 2 : 3; column = item.isWeapon() ? 2 : 3;
break; break;
} }
case StoneSuper: case STONE_SUPER:
{ {
column = item.isWeapon() ? 4 : 5; column = item.isWeapon() ? 4 : 5;
break; break;
} }
case CrystalSuper: case CRYSTAL_SUPER:
{ {
column = item.isWeapon() ? 6 : 7; column = item.isWeapon() ? 6 : 7;
break; break;
} }
case Jewel: case JEWEL:
{ {
column = item.isWeapon() ? 8 : 9; column = item.isWeapon() ? 8 : 9;
break; break;
@@ -262,4 +243,14 @@ public class Elementals
} }
return true; return true;
} }
public static ElementalAttributeData getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
}
} }

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItems> 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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType; 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.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest; 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.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -111,7 +112,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return; 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); client.sendPacket(SystemMessageId.ELEMENTAL_POWER_ENHANCER_USAGE_REQUIREMENT_IS_NOT_SUFFICIENT);
player.removeRequest(request.getClass()); player.removeRequest(request.getClass());
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId(); final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count); 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 // Armors have the opposite element
if (item.isArmor()) if (item.isArmor())
{ {
@@ -303,7 +304,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
player.removeRequest(EnchantItemAttributeRequest.class); player.removeRequest(EnchantItemAttributeRequest.class);
return -1; return -1;
} }
final boolean success = Elementals.isSuccess(item, stone.getId()); final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success) if (success)
{ {
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false); item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -314,7 +315,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId) public int getLimit(ItemInstance item, int sotneId)
{ {
final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId); final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null) if (elementItem == null)
{ {
return 0; return 0;
@@ -322,30 +323,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon()) 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) 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 (item.isWeapon())
{ {
if (oldValue == 0) 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()) else if (item.isArmor())
{ {
return Elementals.ARMOR_BONUS; return ElementalAttributeData.ARMOR_BONUS;
} }
} }
return 0; return 0;

View File

@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,17 +41,17 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{ {
_itemId = stone.getDisplayId(); _itemId = stone.getDisplayId();
_count = stone.getCount(); _count = stone.getCount();
_atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId)); _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE) if (_atribute == AttributeType.NONE)
{ {
throw new IllegalArgumentException("Undefined Atribute item: " + stone); 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 // Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems()) for (ItemInstance item : player.getInventory().getItems())
{ {
if (Elementals.isElementableWithStone(item, stone.getId())) if (ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getId()))
{ {
_items.add(item.getObjectId()); _items.add(item.getObjectId());
} }

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Stone -->
<item id="10521" elemental="FIRE" type="STONE" />
<item id="10522" elemental="WATER" type="STONE" />
<item id="10524" elemental="WIND" type="STONE" />
<item id="10523" elemental="EARTH" type="STONE" />
<item id="10526" elemental="HOLY" type="STONE" />
<item id="10525" elemental="DARK" type="STONE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewels are only for R110 grade -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Energy -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
<!-- GoD+ Stones -->
<item id="22635" elemental="FIRE" type="STONE" />
<item id="22636" elemental="WATER" type="STONE" />
<item id="22637" elemental="EARTH" type="STONE" />
<item id="22638" elemental="WIND" type="STONE" />
<item id="22639" elemental="DARK" type="STONE" />
<item id="22640" elemental="HOLY" type="STONE" />
<item id="22919" elemental="FIRE" type="STONE" />
<item id="22920" elemental="WATER" type="STONE" />
<item id="22921" elemental="EARTH" type="STONE" />
<item id="22922" elemental="WIND" type="STONE" />
<item id="22923" elemental="DARK" type="STONE" />
<item id="22924" elemental="HOLY" type="STONE" />
<item id="33481" elemental="FIRE" type="STONE_SUPER" />
<item id="33482" elemental="WATER" type="STONE_SUPER" />
<item id="33483" elemental="EARTH" type="STONE_SUPER" />
<item id="33484" elemental="WIND" type="STONE_SUPER" />
<item id="33485" elemental="DARK" type="STONE_SUPER" />
<item id="33486" elemental="HOLY" type="STONE_SUPER" />
<item id="33863" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="33864" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="33865" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="33866" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="33867" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="33868" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="33869" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="33870" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="33871" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="33872" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="33873" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="33874" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34661" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="34662" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="34663" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="34664" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="34665" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="34666" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="34667" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="34668" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="34669" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="34670" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="34671" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="34672" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="34790" elemental="FIRE" type="STONE" />
<item id="34791" elemental="WATER" type="STONE" />
<item id="34792" elemental="EARTH" type="STONE" />
<item id="34793" elemental="WIND" type="STONE" />
<item id="34794" elemental="DARK" type="STONE" />
<item id="34795" elemental="HOLY" type="STONE" />
<item id="35729" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="35730" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="35731" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="35732" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="35733" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="35734" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="35735" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="35736" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="35737" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="35738" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="35739" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="35740" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="36960" elemental="FIRE" type="STONE_SUPER" power="60" />
<item id="36961" elemental="WATER" type="STONE_SUPER" power="60" />
<item id="36962" elemental="EARTH" type="STONE_SUPER" power="60" />
<item id="36963" elemental="WIND" type="STONE_SUPER" power="60" />
<item id="36964" elemental="DARK" type="STONE_SUPER" power="60" />
<item id="36965" elemental="HOLY" type="STONE_SUPER" power="60" />
<item id="36966" elemental="FIRE" type="STONE_SUPER" power="150" />
<item id="36967" elemental="WATER" type="STONE_SUPER" power="150" />
<item id="36968" elemental="EARTH" type="STONE_SUPER" power="150" />
<item id="36969" elemental="WIND" type="STONE_SUPER" power="150" />
<item id="36970" elemental="DARK" type="STONE_SUPER" power="150" />
<item id="36971" elemental="HOLY" type="STONE_SUPER" power="150" />
<item id="37499" elemental="FIRE" type="STONE" />
<item id="37500" elemental="WATER" type="STONE" />
<item id="37501" elemental="EARTH" type="STONE" />
<item id="37502" elemental="WIND" type="STONE" />
<item id="37503" elemental="DARK" type="STONE" />
<item id="37504" elemental="HOLY" type="STONE" />
<!-- GoD+ Crystals -->
<item id="22641" elemental="FIRE" type="CRYSTAL" />
<item id="22642" elemental="WATER" type="CRYSTAL" />
<item id="22643" elemental="EARTH" type="CRYSTAL" />
<item id="22644" elemental="WIND" type="CRYSTAL" />
<item id="22645" elemental="DARK" type="CRYSTAL" />
<item id="22646" elemental="HOLY" type="CRYSTAL" />
<item id="22925" elemental="FIRE" type="CRYSTAL" />
<item id="22926" elemental="WATER" type="CRYSTAL" />
<item id="22927" elemental="EARTH" type="CRYSTAL" />
<item id="22928" elemental="WIND" type="CRYSTAL" />
<item id="22929" elemental="DARK" type="CRYSTAL" />
<item id="22930" elemental="HOLY" type="CRYSTAL" />
<item id="33487" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="33488" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="33489" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="33490" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="33491" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="33492" elemental="HOLY" type="CRYSTAL_SUPER" />
<item id="34796" elemental="FIRE" type="CRYSTAL" />
<item id="34797" elemental="WATER" type="CRYSTAL" />
<item id="34798" elemental="EARTH" type="CRYSTAL" />
<item id="34799" elemental="WIND" type="CRYSTAL" />
<item id="34800" elemental="DARK" type="CRYSTAL" />
<item id="34801" elemental="HOLY" type="CRYSTAL" />
<item id="36972" elemental="FIRE" type="CRYSTAL_SUPER" />
<item id="36973" elemental="WATER" type="CRYSTAL_SUPER" />
<item id="36974" elemental="EARTH" type="CRYSTAL_SUPER" />
<item id="36975" elemental="WIND" type="CRYSTAL_SUPER" />
<item id="36976" elemental="DARK" type="CRYSTAL_SUPER" />
<item id="36977" elemental="HOLY" type="CRYSTAL_SUPER" />
<!-- Attribute Practice Fire Stone -->
<item id="48169" elemental="FIRE" type="STONE" />
</list>

View File

@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
<xs:attribute type="xs:short" name="power" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -63,6 +63,7 @@ import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.CubicData; import org.l2jmobius.gameserver.data.xml.CubicData;
import org.l2jmobius.gameserver.data.xml.DailyMissionData; import org.l2jmobius.gameserver.data.xml.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -271,6 +272,7 @@ public class GameServer
EnchantItemGroupsData.getInstance(); EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance(); EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance(); EnchantItemOptionsData.getInstance();
ElementalAttributeData.getInstance();
ItemCrystallizationData.getInstance(); ItemCrystallizationData.getInstance();
OptionData.getInstance(); OptionData.getInstance();
VariationData.getInstance(); VariationData.getInstance();

View File

@@ -14,34 +14,31 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.data.xml;
import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.l2jmobius.Config; import org.w3c.dom.Document;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
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<Integer, ElementalItems> TABLE = new HashMap<>(); private static final Map<Integer, ElementalItemHolder> ELEMENTAL_ITEMS = 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 FIRST_WEAPON_BONUS = 20;
public static final int NEXT_WEAPON_BONUS = 5; 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.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.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.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 */ /* @formatter:on */
public enum ElementalItemType protected ElementalAttributeData()
{ {
Stone(3), load();
StoneSuper(3),
Crystal(6),
CrystalSuper(6),
Jewel(9),
Energy(12);
public int _maxLevel;
ElementalItemType(int maxLevel)
{
_maxLevel = maxLevel;
}
} }
public enum ElementalItems @Override
public void load()
{ {
fireStone(FIRE, 9546, ElementalItemType.Stone, 0), ELEMENTAL_ITEMS.clear();
waterStone(WATER, 9547, ElementalItemType.Stone, 0), parseDatapackFile("data/ElementalAttributeData.xml");
windStone(WIND, 9549, ElementalItemType.Stone, 0), LOGGER.info(getClass().getSimpleName() + ": Loaded " + ELEMENTAL_ITEMS.size() + " elemental attribute items.");
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) @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) 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) if (item != null)
{ {
return item._type._maxLevel; return item.getType().getMaxLevel();
} }
return -1; 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 row = -1;
int column = -1; int column = -1;
@@ -226,31 +202,36 @@ public class Elementals
row = 5; row = 5;
break; 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; column = item.isWeapon() ? 0 : 1;
break; break;
} }
case Crystal: case CRYSTAL:
{ {
column = item.isWeapon() ? 2 : 3; column = item.isWeapon() ? 2 : 3;
break; break;
} }
case StoneSuper: case STONE_SUPER:
{ {
column = item.isWeapon() ? 4 : 5; column = item.isWeapon() ? 4 : 5;
break; break;
} }
case CrystalSuper: case CRYSTAL_SUPER:
{ {
column = item.isWeapon() ? 6 : 7; column = item.isWeapon() ? 6 : 7;
break; break;
} }
case Jewel: case JEWEL:
{ {
column = item.isWeapon() ? 8 : 9; column = item.isWeapon() ? 8 : 9;
break; break;
@@ -262,4 +243,14 @@ public class Elementals
} }
return true; return true;
} }
public static ElementalAttributeData getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final ElementalAttributeData INSTANCE = new ElementalAttributeData();
}
} }

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItems> 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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -18,11 +18,12 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.PrivateStoreType; 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.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.request.EnchantItemAttributeRequest; 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.enchant.attribute.AttributeHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
@@ -111,7 +112,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return; 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); client.sendPacket(SystemMessageId.ELEMENTAL_POWER_ENHANCER_USAGE_REQUIREMENT_IS_NOT_SUFFICIENT);
player.removeRequest(request.getClass()); player.removeRequest(request.getClass());
@@ -140,7 +141,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
final int stoneId = stone.getId(); final int stoneId = stone.getId();
final long count = Math.min(stone.getCount(), _count); 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 // Armors have the opposite element
if (item.isArmor()) if (item.isArmor())
{ {
@@ -303,7 +304,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
player.removeRequest(EnchantItemAttributeRequest.class); player.removeRequest(EnchantItemAttributeRequest.class);
return -1; return -1;
} }
final boolean success = Elementals.isSuccess(item, stone.getId()); final boolean success = ElementalAttributeData.getInstance().isSuccess(item, stone.getId());
if (success) if (success)
{ {
item.setAttribute(new AttributeHolder(elementToAdd, newPower), false); item.setAttribute(new AttributeHolder(elementToAdd, newPower), false);
@@ -314,7 +315,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId) public int getLimit(ItemInstance item, int sotneId)
{ {
final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId); final ElementalItemHolder elementItem = ElementalAttributeData.getInstance().getItemElemental(sotneId);
if (elementItem == null) if (elementItem == null)
{ {
return 0; return 0;
@@ -322,30 +323,30 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon()) 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) 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 (item.isWeapon())
{ {
if (oldValue == 0) 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()) else if (item.isArmor())
{ {
return Elementals.ARMOR_BONUS; return ElementalAttributeData.ARMOR_BONUS;
} }
} }
return 0; return 0;

View File

@@ -20,8 +20,8 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import org.l2jmobius.gameserver.enums.AttributeType; 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.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets; import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -41,17 +41,17 @@ public class ExChooseInventoryAttributeItem implements IClientOutgoingPacket
{ {
_itemId = stone.getDisplayId(); _itemId = stone.getDisplayId();
_count = stone.getCount(); _count = stone.getCount();
_atribute = AttributeType.findByClientId(Elementals.getItemElement(_itemId)); _atribute = ElementalAttributeData.getInstance().getItemElement(_itemId);
if (_atribute == AttributeType.NONE) if (_atribute == AttributeType.NONE)
{ {
throw new IllegalArgumentException("Undefined Atribute item: " + stone); 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 // Register only items that can be put an attribute stone/crystal
for (ItemInstance item : player.getInventory().getItems()) for (ItemInstance item : player.getInventory().getItems())
{ {
if (Elementals.isElementableWithStone(item, stone.getId())) if (ElementalAttributeData.getInstance().isElementableWithStone(item, stone.getId()))
{ {
_items.add(item.getObjectId()); _items.add(item.getObjectId());
} }

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Ore -->
<item id="10521" elemental="FIRE" type="ROUGH_ORE" />
<item id="10522" elemental="WATER" type="ROUGH_ORE" />
<item id="10524" elemental="WIND" type="ROUGH_ORE" />
<item id="10523" elemental="EARTH" type="ROUGH_ORE" />
<item id="10526" elemental="HOLY" type="ROUGH_ORE" />
<item id="10525" elemental="DARK" type="ROUGH_ORE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewel -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Not yet supported by client (Freya PTS) -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
</list>

View File

@@ -0,0 +1,19 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -55,6 +55,7 @@ import org.l2jmobius.gameserver.data.xml.BuyListData;
import org.l2jmobius.gameserver.data.xml.CategoryData; import org.l2jmobius.gameserver.data.xml.CategoryData;
import org.l2jmobius.gameserver.data.xml.ClassListData; import org.l2jmobius.gameserver.data.xml.ClassListData;
import org.l2jmobius.gameserver.data.xml.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.EnchantItemHPBonusData;
@@ -250,6 +251,7 @@ public class GameServer
EnchantItemGroupsData.getInstance(); EnchantItemGroupsData.getInstance();
EnchantItemData.getInstance(); EnchantItemData.getInstance();
EnchantItemOptionsData.getInstance(); EnchantItemOptionsData.getInstance();
ElementalAttributeData.getInstance();
OptionData.getInstance(); OptionData.getInstance();
EnchantItemHPBonusData.getInstance(); EnchantItemHPBonusData.getInstance();
MerchantPriceConfigTable.getInstance().loadInstances(); MerchantPriceConfigTable.getInstance().loadInstances();

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<Integer, ElementalItemHolder> 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();
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -16,24 +16,14 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.HashMap; import org.l2jmobius.gameserver.data.xml.ElementalAttributeData;
import java.util.Map;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; 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.Stat;
import org.l2jmobius.gameserver.model.stats.functions.FuncAdd; import org.l2jmobius.gameserver.model.stats.functions.FuncAdd;
public class Elementals public class Elementals
{ {
private static final Map<Integer, ElementalItems> TABLE = new HashMap<>();
static
{
for (ElementalItems item : ElementalItems.values())
{
TABLE.put(item._itemId, item);
}
}
public static final byte NONE = -1; public static final byte NONE = -1;
public static final byte FIRE = 0; public static final byte FIRE = 0;
public static final byte WATER = 1; public static final byte WATER = 1;
@@ -84,87 +74,21 @@ public class Elementals
// TODO: Higher stones // 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) public static byte getItemElement(int itemId)
{ {
final ElementalItems item = TABLE.get(itemId); final ElementalItemHolder item = ElementalAttributeData.getInstance().getElementalItem(itemId);
return item != null ? item._element : NONE; 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) public static int getMaxElementLevel(int itemId)
{ {
final ElementalItems item = TABLE.get(itemId); final ElementalItemHolder item = ElementalAttributeData.getInstance().getElementalItem(itemId);
return item != null ? item._type._maxLevel : -1; return item != null ? item.getType().getMaxLevel() : -1;
} }
public static String getElementName(byte element) public static String getElementName(byte element)

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -22,6 +22,7 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.PrivateStoreType; import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.model.Elementals; import org.l2jmobius.gameserver.model.Elementals;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; 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.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
@@ -190,25 +191,25 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
return; return;
} }
boolean success = false; boolean success = false;
switch (Elementals.getItemElemental(stoneId)._type) switch (Elementals.getItemElemental(stoneId).getType())
{ {
case Stone: case STONE:
case Roughore: case ROUGH_ORE:
{ {
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_STONE; success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_STONE;
break; break;
} }
case Crystal: case CRYSTAL:
{ {
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_CRYSTAL; success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_CRYSTAL;
break; break;
} }
case Jewel: case JEWEL:
{ {
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_JEWEL; success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_JEWEL;
break; break;
} }
case Energy: case ENERGY:
{ {
success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_ENERGY; success = Rnd.get(100) < Config.ENCHANT_CHANCE_ELEMENT_ENERGY;
break; break;
@@ -278,7 +279,7 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
public int getLimit(ItemInstance item, int sotneId) public int getLimit(ItemInstance item, int sotneId)
{ {
final Elementals.ElementalItems elementItem = Elementals.getItemElemental(sotneId); final ElementalItemHolder elementItem = Elementals.getItemElemental(sotneId);
if (elementItem == null) if (elementItem == null)
{ {
return 0; return 0;
@@ -286,9 +287,9 @@ public class RequestExEnchantItemAttribute implements IClientIncomingPacket
if (item.isWeapon()) 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) public int getPowerToAdd(int stoneId, int oldValue, ItemInstance item)

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalAttributeData.xsd">
<!-- Stone -->
<item id="9546" elemental="FIRE" type="STONE" />
<item id="9547" elemental="WATER" type="STONE" />
<item id="9549" elemental="WIND" type="STONE" />
<item id="9548" elemental="EARTH" type="STONE" />
<item id="9551" elemental="HOLY" type="STONE" />
<item id="9550" elemental="DARK" type="STONE" />
<!-- Rough Ore -->
<item id="10521" elemental="FIRE" type="ROUGH_ORE" />
<item id="10522" elemental="WATER" type="ROUGH_ORE" />
<item id="10524" elemental="WIND" type="ROUGH_ORE" />
<item id="10523" elemental="EARTH" type="ROUGH_ORE" />
<item id="10526" elemental="HOLY" type="ROUGH_ORE" />
<item id="10525" elemental="DARK" type="ROUGH_ORE" />
<!-- Crystal -->
<item id="9552" elemental="FIRE" type="CRYSTAL" />
<item id="9553" elemental="WATER" type="CRYSTAL" />
<item id="9555" elemental="WIND" type="CRYSTAL" />
<item id="9554" elemental="EARTH" type="CRYSTAL" />
<item id="9557" elemental="HOLY" type="CRYSTAL" />
<item id="9556" elemental="DARK" type="CRYSTAL" />
<!-- Jewel -->
<item id="9558" elemental="FIRE" type="JEWEL" />
<item id="9559" elemental="WATER" type="JEWEL" />
<item id="9561" elemental="WIND" type="JEWEL" />
<item id="9560" elemental="EARTH" type="JEWEL" />
<item id="9563" elemental="HOLY" type="JEWEL" />
<item id="9562" elemental="DARK" type="JEWEL" />
<!-- Not yet supported by client (Freya PTS) -->
<item id="9564" elemental="FIRE" type="ENERGY" />
<item id="9565" elemental="WATER" type="ENERGY" />
<item id="9567" elemental="WIND" type="ENERGY" />
<item id="9566" elemental="EARTH" type="ENERGY" />
<item id="9569" elemental="HOLY" type="ENERGY" />
<item id="9568" elemental="DARK" type="ENERGY" />
</list>

View File

@@ -0,0 +1,19 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:string" name="elemental" use="required"/>
<xs:attribute type="xs:string" name="type" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Some files were not shown because too many files have changed in this diff Show More