473 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			473 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2004-2015 L2J Server
 | |
|  * 
 | |
|  * This file is part of L2J Server.
 | |
|  * 
 | |
|  * L2J Server is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation, either version 3 of the License, or
 | |
|  * (at your option) any later version.
 | |
|  * 
 | |
|  * L2J Server is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 | |
|  * General Public License for more details.
 | |
|  * 
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program. If not, see <http://www.gnu.org/licenses/>.
 | |
|  */
 | |
| package com.l2jserver.gameserver.model;
 | |
| 
 | |
| import java.util.HashMap;
 | |
| import java.util.Map;
 | |
| 
 | |
| import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 | |
| import com.l2jserver.gameserver.model.stats.Stats;
 | |
| import com.l2jserver.gameserver.model.stats.functions.FuncAdd;
 | |
| 
 | |
| public final 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 FIRE = 0;
 | |
| 	public static final byte WATER = 1;
 | |
| 	public static final byte WIND = 2;
 | |
| 	public static final byte EARTH = 3;
 | |
| 	public static final byte HOLY = 4;
 | |
| 	public 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
 | |
| 	};
 | |
| 	
 | |
| 	public static enum ElementalItemType
 | |
| 	{
 | |
| 		Stone(3),
 | |
| 		Roughore(3),
 | |
| 		Stone60(3),
 | |
| 		Stone150(3),
 | |
| 		Crystal(6),
 | |
| 		Crystal300(6),
 | |
| 		Jewel(9),
 | |
| 		Energy(12);
 | |
| 		
 | |
| 		public int _maxLevel;
 | |
| 		
 | |
| 		private ElementalItemType(int maxLvl)
 | |
| 		{
 | |
| 			_maxLevel = maxLvl;
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	public static enum ElementalItems
 | |
| 	{
 | |
| 		fireStone1(FIRE, 9546, ElementalItemType.Stone),
 | |
| 		fireStone2(FIRE, 22635, ElementalItemType.Stone),
 | |
| 		fireStone3(FIRE, 34790, ElementalItemType.Stone),
 | |
| 		fireStone4(FIRE, 37499, ElementalItemType.Stone),
 | |
| 		fireStone5(FIRE, 22919, ElementalItemType.Stone),
 | |
| 		fireStone6(FIRE, 34661, ElementalItemType.Stone60),
 | |
| 		fireStone7(FIRE, 36960, ElementalItemType.Stone60),
 | |
| 		fireStone8(FIRE, 33863, ElementalItemType.Stone60),
 | |
| 		fireStone9(FIRE, 35729, ElementalItemType.Stone60),
 | |
| 		fireStone10(FIRE, 34667, ElementalItemType.Stone150),
 | |
| 		fireStone11(FIRE, 36966, ElementalItemType.Stone150),
 | |
| 		fireStone12(FIRE, 33869, ElementalItemType.Stone150),
 | |
| 		fireStone13(FIRE, 35735, ElementalItemType.Stone150),
 | |
| 		fireStone14(FIRE, 33481, ElementalItemType.Stone150),
 | |
| 		waterStone1(WATER, 9547, ElementalItemType.Stone),
 | |
| 		waterStone2(WATER, 34791, ElementalItemType.Stone),
 | |
| 		waterStone3(WATER, 22636, ElementalItemType.Stone),
 | |
| 		waterStone4(WATER, 37500, ElementalItemType.Stone),
 | |
| 		waterStone5(WATER, 22920, ElementalItemType.Stone),
 | |
| 		waterStone6(WATER, 34662, ElementalItemType.Stone60),
 | |
| 		waterStone7(WATER, 36961, ElementalItemType.Stone60),
 | |
| 		waterStone8(WATER, 33864, ElementalItemType.Stone60),
 | |
| 		waterStone9(WATER, 35730, ElementalItemType.Stone60),
 | |
| 		waterStone10(WATER, 34668, ElementalItemType.Stone150),
 | |
| 		waterStone11(WATER, 36967, ElementalItemType.Stone150),
 | |
| 		waterStone12(WATER, 33870, ElementalItemType.Stone150),
 | |
| 		waterStone13(WATER, 35736, ElementalItemType.Stone150),
 | |
| 		waterStone14(WATER, 33482, ElementalItemType.Stone150),
 | |
| 		windStone1(WIND, 9549, ElementalItemType.Stone),
 | |
| 		windStone2(WIND, 34793, ElementalItemType.Stone),
 | |
| 		windStone3(WIND, 22638, ElementalItemType.Stone),
 | |
| 		windStone4(WIND, 37502, ElementalItemType.Stone),
 | |
| 		windStone5(WIND, 22922, ElementalItemType.Stone),
 | |
| 		windStone6(WIND, 34664, ElementalItemType.Stone60),
 | |
| 		windStone7(WIND, 36963, ElementalItemType.Stone60),
 | |
| 		windStone8(WIND, 33866, ElementalItemType.Stone60),
 | |
| 		windStone9(WIND, 35732, ElementalItemType.Stone60),
 | |
| 		windStone10(WIND, 34670, ElementalItemType.Stone150),
 | |
| 		windStone11(WIND, 36969, ElementalItemType.Stone150),
 | |
| 		windStone12(WIND, 33872, ElementalItemType.Stone150),
 | |
| 		windStone13(WIND, 35738, ElementalItemType.Stone150),
 | |
| 		windStone14(WIND, 33484, ElementalItemType.Stone150),
 | |
| 		earthStone1(EARTH, 9548, ElementalItemType.Stone),
 | |
| 		earthStone2(EARTH, 34792, ElementalItemType.Stone),
 | |
| 		earthStone3(EARTH, 22637, ElementalItemType.Stone),
 | |
| 		earthStone4(EARTH, 37501, ElementalItemType.Stone),
 | |
| 		earthStone5(EARTH, 22921, ElementalItemType.Stone),
 | |
| 		earthStone6(EARTH, 34663, ElementalItemType.Stone60),
 | |
| 		earthStone7(EARTH, 36962, ElementalItemType.Stone60),
 | |
| 		earthStone8(EARTH, 33865, ElementalItemType.Stone60),
 | |
| 		earthStone9(EARTH, 35731, ElementalItemType.Stone60),
 | |
| 		earthStone10(EARTH, 34669, ElementalItemType.Stone150),
 | |
| 		earthStone11(EARTH, 36968, ElementalItemType.Stone150),
 | |
| 		earthStone12(EARTH, 33871, ElementalItemType.Stone150),
 | |
| 		earthStone13(EARTH, 35737, ElementalItemType.Stone150),
 | |
| 		earthStone14(EARTH, 33483, ElementalItemType.Stone150),
 | |
| 		divineStone1(HOLY, 9551, ElementalItemType.Stone),
 | |
| 		divineStone2(HOLY, 34795, ElementalItemType.Stone),
 | |
| 		divineStone3(HOLY, 22640, ElementalItemType.Stone),
 | |
| 		divineStone4(HOLY, 37504, ElementalItemType.Stone),
 | |
| 		divineStone5(HOLY, 22924, ElementalItemType.Stone),
 | |
| 		divineStone6(HOLY, 34666, ElementalItemType.Stone60),
 | |
| 		divineStone7(HOLY, 36965, ElementalItemType.Stone60),
 | |
| 		divineStone8(HOLY, 33868, ElementalItemType.Stone60),
 | |
| 		divineStone9(HOLY, 35734, ElementalItemType.Stone60),
 | |
| 		divineStone10(HOLY, 34672, ElementalItemType.Stone150),
 | |
| 		divineStone11(HOLY, 36971, ElementalItemType.Stone150),
 | |
| 		divineStone12(HOLY, 33874, ElementalItemType.Stone150),
 | |
| 		divineStone13(HOLY, 35740, ElementalItemType.Stone150),
 | |
| 		divineStone14(HOLY, 33486, ElementalItemType.Stone150),
 | |
| 		darkStone1(DARK, 9550, ElementalItemType.Stone),
 | |
| 		darkStone2(DARK, 34794, ElementalItemType.Stone),
 | |
| 		darkStone3(DARK, 22639, ElementalItemType.Stone),
 | |
| 		darkStone4(DARK, 37503, ElementalItemType.Stone),
 | |
| 		darkStone5(DARK, 22923, ElementalItemType.Stone),
 | |
| 		darkStone6(DARK, 34665, ElementalItemType.Stone60),
 | |
| 		darkStone7(DARK, 36964, ElementalItemType.Stone60),
 | |
| 		darkStone8(DARK, 33867, ElementalItemType.Stone60),
 | |
| 		darkStone9(DARK, 35733, ElementalItemType.Stone60),
 | |
| 		darkStone10(DARK, 34671, ElementalItemType.Stone150),
 | |
| 		darkStone11(DARK, 36970, ElementalItemType.Stone150),
 | |
| 		darkStone12(DARK, 33873, ElementalItemType.Stone150),
 | |
| 		darkStone13(DARK, 35739, ElementalItemType.Stone150),
 | |
| 		darkStone14(DARK, 33485, ElementalItemType.Stone150),
 | |
| 		
 | |
| 		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),
 | |
| 		
 | |
| 		fireCrystal1(FIRE, 9552, ElementalItemType.Crystal),
 | |
| 		fireCrystal2(FIRE, 34796, ElementalItemType.Crystal),
 | |
| 		fireCrystal3(FIRE, 22925, ElementalItemType.Crystal),
 | |
| 		fireCrystal4(FIRE, 22641, ElementalItemType.Crystal),
 | |
| 		fireCrystal5(FIRE, 36972, ElementalItemType.Crystal300),
 | |
| 		fireCrystal6(FIRE, 33487, ElementalItemType.Crystal300),
 | |
| 		waterCrystal1(WATER, 9553, ElementalItemType.Crystal),
 | |
| 		waterCrystal2(WATER, 34797, ElementalItemType.Crystal),
 | |
| 		waterCrystal3(WATER, 22926, ElementalItemType.Crystal),
 | |
| 		waterCrystal4(WATER, 22642, ElementalItemType.Crystal),
 | |
| 		waterCrystal5(WATER, 36973, ElementalItemType.Crystal300),
 | |
| 		waterCrystal6(WATER, 33488, ElementalItemType.Crystal300),
 | |
| 		windCrystal1(WIND, 9555, ElementalItemType.Crystal),
 | |
| 		windCrystal2(WIND, 34799, ElementalItemType.Crystal),
 | |
| 		windCrystal3(WIND, 22928, ElementalItemType.Crystal),
 | |
| 		windCrystal4(WIND, 22644, ElementalItemType.Crystal),
 | |
| 		windCrystal5(WIND, 36975, ElementalItemType.Crystal300),
 | |
| 		windCrystal6(WIND, 33490, ElementalItemType.Crystal300),
 | |
| 		earthCrystal1(EARTH, 9554, ElementalItemType.Crystal),
 | |
| 		earthCrystal2(EARTH, 34798, ElementalItemType.Crystal),
 | |
| 		earthCrystal3(EARTH, 22927, ElementalItemType.Crystal),
 | |
| 		earthCrystal4(EARTH, 22643, ElementalItemType.Crystal),
 | |
| 		earthCrystal5(EARTH, 36974, ElementalItemType.Crystal300),
 | |
| 		earthCrystal6(EARTH, 33489, ElementalItemType.Crystal300),
 | |
| 		divineCrystal1(HOLY, 9557, ElementalItemType.Crystal),
 | |
| 		divineCrystal2(HOLY, 34801, ElementalItemType.Crystal),
 | |
| 		divineCrystal3(HOLY, 22930, ElementalItemType.Crystal),
 | |
| 		divineCrystal4(HOLY, 22646, ElementalItemType.Crystal),
 | |
| 		divineCrystal5(HOLY, 36977, ElementalItemType.Crystal300),
 | |
| 		divineCrystal6(HOLY, 33492, ElementalItemType.Crystal300),
 | |
| 		darkCrystal1(DARK, 9556, ElementalItemType.Crystal),
 | |
| 		darkCrystal2(DARK, 34800, ElementalItemType.Crystal),
 | |
| 		darkCrystal3(DARK, 22929, ElementalItemType.Crystal),
 | |
| 		darkCrystal4(DARK, 22645, ElementalItemType.Crystal),
 | |
| 		darkCrystal5(DARK, 36796, ElementalItemType.Crystal300),
 | |
| 		darkCrystal6(DARK, 33491, ElementalItemType.Crystal300),
 | |
| 		
 | |
| 		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)
 | |
| 	{
 | |
| 		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)
 | |
| 	{
 | |
| 		ElementalItems item = TABLE.get(itemId);
 | |
| 		if (item != null)
 | |
| 		{
 | |
| 			return item._type._maxLevel;
 | |
| 		}
 | |
| 		return -1;
 | |
| 	}
 | |
| 	
 | |
| 	public static String getElementName(byte element)
 | |
| 	{
 | |
| 		switch (element)
 | |
| 		{
 | |
| 			case FIRE:
 | |
| 				return "Fire";
 | |
| 			case WATER:
 | |
| 				return "Water";
 | |
| 			case WIND:
 | |
| 				return "Wind";
 | |
| 			case EARTH:
 | |
| 				return "Earth";
 | |
| 			case DARK:
 | |
| 				return "Dark";
 | |
| 			case HOLY:
 | |
| 				return "Holy";
 | |
| 		}
 | |
| 		return "None";
 | |
| 	}
 | |
| 	
 | |
| 	public static byte getElementId(String name)
 | |
| 	{
 | |
| 		String tmp = name.toLowerCase();
 | |
| 		if (tmp.equals("fire"))
 | |
| 		{
 | |
| 			return FIRE;
 | |
| 		}
 | |
| 		if (tmp.equals("water"))
 | |
| 		{
 | |
| 			return WATER;
 | |
| 		}
 | |
| 		if (tmp.equals("wind"))
 | |
| 		{
 | |
| 			return WIND;
 | |
| 		}
 | |
| 		if (tmp.equals("earth"))
 | |
| 		{
 | |
| 			return EARTH;
 | |
| 		}
 | |
| 		if (tmp.equals("dark"))
 | |
| 		{
 | |
| 			return DARK;
 | |
| 		}
 | |
| 		if (tmp.equals("holy"))
 | |
| 		{
 | |
| 			return HOLY;
 | |
| 		}
 | |
| 		return NONE;
 | |
| 	}
 | |
| 	
 | |
| 	public static byte getOppositeElement(byte element)
 | |
| 	{
 | |
| 		return (byte) (((element % 2) == 0) ? (element + 1) : (element - 1));
 | |
| 	}
 | |
| 	
 | |
| 	public static class ElementalStatBoni
 | |
| 	{
 | |
| 		private byte _elementalType;
 | |
| 		private int _elementalValue;
 | |
| 		private boolean _active;
 | |
| 		
 | |
| 		public ElementalStatBoni(byte type, int value)
 | |
| 		{
 | |
| 			_elementalType = type;
 | |
| 			_elementalValue = value;
 | |
| 			_active = false;
 | |
| 		}
 | |
| 		
 | |
| 		public void applyBonus(L2PcInstance player, boolean isArmor)
 | |
| 		{
 | |
| 			// make sure the bonuses are not applied twice..
 | |
| 			if (_active)
 | |
| 			{
 | |
| 				return;
 | |
| 			}
 | |
| 			
 | |
| 			switch (_elementalType)
 | |
| 			{
 | |
| 				case FIRE:
 | |
| 					player.addStatFunc(new FuncAdd(isArmor ? Stats.FIRE_RES : Stats.FIRE_POWER, 0x40, this, _elementalValue, null));
 | |
| 					break;
 | |
| 				case WATER:
 | |
| 					player.addStatFunc(new FuncAdd(isArmor ? Stats.WATER_RES : Stats.WATER_POWER, 0x40, this, _elementalValue, null));
 | |
| 					break;
 | |
| 				case WIND:
 | |
| 					player.addStatFunc(new FuncAdd(isArmor ? Stats.WIND_RES : Stats.WIND_POWER, 0x40, this, _elementalValue, null));
 | |
| 					break;
 | |
| 				case EARTH:
 | |
| 					player.addStatFunc(new FuncAdd(isArmor ? Stats.EARTH_RES : Stats.EARTH_POWER, 0x40, this, _elementalValue, null));
 | |
| 					break;
 | |
| 				case DARK:
 | |
| 					player.addStatFunc(new FuncAdd(isArmor ? Stats.DARK_RES : Stats.DARK_POWER, 0x40, this, _elementalValue, null));
 | |
| 					break;
 | |
| 				case HOLY:
 | |
| 					player.addStatFunc(new FuncAdd(isArmor ? Stats.HOLY_RES : Stats.HOLY_POWER, 0x40, this, _elementalValue, null));
 | |
| 					break;
 | |
| 			}
 | |
| 			
 | |
| 			_active = true;
 | |
| 		}
 | |
| 		
 | |
| 		public void removeBonus(L2PcInstance player)
 | |
| 		{
 | |
| 			// make sure the bonuses are not removed twice
 | |
| 			if (!_active)
 | |
| 			{
 | |
| 				return;
 | |
| 			}
 | |
| 			
 | |
| 			player.removeStatsOwner(this);
 | |
| 			
 | |
| 			_active = false;
 | |
| 		}
 | |
| 		
 | |
| 		public void setValue(int val)
 | |
| 		{
 | |
| 			_elementalValue = val;
 | |
| 		}
 | |
| 		
 | |
| 		public void setElement(byte type)
 | |
| 		{
 | |
| 			_elementalType = type;
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	// non static:
 | |
| 	private ElementalStatBoni _boni = null;
 | |
| 	private byte _element = NONE;
 | |
| 	private int _value = 0;
 | |
| 	
 | |
| 	public byte getElement()
 | |
| 	{
 | |
| 		return _element;
 | |
| 	}
 | |
| 	
 | |
| 	public void setElement(byte type)
 | |
| 	{
 | |
| 		_element = type;
 | |
| 		_boni.setElement(type);
 | |
| 	}
 | |
| 	
 | |
| 	public int getValue()
 | |
| 	{
 | |
| 		return _value;
 | |
| 	}
 | |
| 	
 | |
| 	public void setValue(int val)
 | |
| 	{
 | |
| 		_value = val;
 | |
| 		_boni.setValue(val);
 | |
| 	}
 | |
| 	
 | |
| 	@Override
 | |
| 	public String toString()
 | |
| 	{
 | |
| 		return getElementName(_element) + " +" + _value;
 | |
| 	}
 | |
| 	
 | |
| 	public Elementals(byte type, int value)
 | |
| 	{
 | |
| 		_element = type;
 | |
| 		_value = value;
 | |
| 		_boni = new ElementalStatBoni(_element, _value);
 | |
| 	}
 | |
| 	
 | |
| 	public void applyBonus(L2PcInstance player, boolean isArmor)
 | |
| 	{
 | |
| 		_boni.applyBonus(player, isArmor);
 | |
| 	}
 | |
| 	
 | |
| 	public void removeBonus(L2PcInstance player)
 | |
| 	{
 | |
| 		_boni.removeBonus(player);
 | |
| 	}
 | |
| 	
 | |
| 	public void updateBonus(L2PcInstance player, boolean isArmor)
 | |
| 	{
 | |
| 		_boni.removeBonus(player);
 | |
| 		_boni.applyBonus(player, isArmor);
 | |
| 	}
 | |
| }
 | 
