actual freya branch
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* This program is free software: you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License as published by the Free Software
|
||||
* Foundation, either version 3 of the License, or (at your option) any later
|
||||
* version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jserver.gameserver.templates.item;
|
||||
|
||||
/**
|
||||
* @author nBd
|
||||
*/
|
||||
public enum L2ActionType
|
||||
{
|
||||
calc,
|
||||
call_skill,
|
||||
capsule,
|
||||
create_mpcc,
|
||||
dice,
|
||||
equip,
|
||||
fishingshot,
|
||||
harvest,
|
||||
hide_name,
|
||||
keep_exp,
|
||||
nick_color,
|
||||
none,
|
||||
peel,
|
||||
recipe,
|
||||
seed,
|
||||
show_adventurer_guide_book,
|
||||
show_html,
|
||||
show_ssq_status,
|
||||
skill_maintain,
|
||||
skill_reduce,
|
||||
soulshot,
|
||||
spiritshot,
|
||||
start_quest,
|
||||
summon_soulshot,
|
||||
summon_spiritshot,
|
||||
xmas_open,
|
||||
}
|
||||
@@ -0,0 +1,163 @@
|
||||
/*
|
||||
* 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 com.l2jserver.gameserver.templates.item;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.l2jserver.gameserver.model.L2ItemInstance;
|
||||
import com.l2jserver.gameserver.model.L2Skill;
|
||||
import com.l2jserver.gameserver.model.actor.L2Character;
|
||||
import com.l2jserver.gameserver.skills.Env;
|
||||
import com.l2jserver.gameserver.skills.SkillHolder;
|
||||
import com.l2jserver.gameserver.skills.funcs.Func;
|
||||
import com.l2jserver.gameserver.skills.funcs.FuncTemplate;
|
||||
import com.l2jserver.gameserver.templates.StatsSet;
|
||||
import com.l2jserver.util.StringUtil;
|
||||
|
||||
/**
|
||||
* This class is dedicated to the management of armors.
|
||||
* @version $Revision: 1.2.2.1.2.6 $ $Date: 2005/03/27 15:30:10 $
|
||||
*/
|
||||
public final class L2Armor extends L2Item
|
||||
{
|
||||
private SkillHolder _enchant4Skill = null; // skill that activates when armor is enchanted +4
|
||||
// private final String[] _skill;
|
||||
private L2ArmorType _type;
|
||||
|
||||
/**
|
||||
* Constructor for Armor.<BR>
|
||||
* <BR>
|
||||
* <U><I>Variables filled :</I></U><BR>
|
||||
* <LI>_avoidModifier</LI> <LI>_pDef & _mDef</LI> <LI>_mpBonus & _hpBonus</LI> <LI>enchant4Skill</LI>
|
||||
* @param type : L2ArmorType designating the type of armor
|
||||
* @param set : StatsSet designating the set of couples (key,value) caracterizing the armor
|
||||
* @see L2Item constructor
|
||||
*/
|
||||
public L2Armor(StatsSet set)
|
||||
{
|
||||
super(set);
|
||||
_type = L2ArmorType.valueOf(set.getString("armor_type", "none").toUpperCase());
|
||||
|
||||
int _bodyPart = getBodyPart();
|
||||
if ((_bodyPart == L2Item.SLOT_NECK) || (_bodyPart == L2Item.SLOT_HAIR) || (_bodyPart == L2Item.SLOT_HAIR2) || (_bodyPart == L2Item.SLOT_HAIRALL) || ((_bodyPart & L2Item.SLOT_L_EAR) != 0) || ((_bodyPart & L2Item.SLOT_L_FINGER) != 0) || ((_bodyPart & L2Item.SLOT_R_BRACELET) != 0) || ((_bodyPart & L2Item.SLOT_L_BRACELET) != 0) || ((_bodyPart & L2Item.SLOT_BACK) != 0))
|
||||
{
|
||||
_type1 = L2Item.TYPE1_WEAPON_RING_EARRING_NECKLACE;
|
||||
_type2 = L2Item.TYPE2_ACCESSORY;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((_type == L2ArmorType.NONE) && (getBodyPart() == L2Item.SLOT_L_HAND))
|
||||
{
|
||||
_type = L2ArmorType.SHIELD;
|
||||
}
|
||||
_type1 = L2Item.TYPE1_SHIELD_ARMOR;
|
||||
_type2 = L2Item.TYPE2_SHIELD_ARMOR;
|
||||
}
|
||||
|
||||
String skill = set.getString("enchant4_skill", null);
|
||||
if (skill != null)
|
||||
{
|
||||
String[] info = skill.split("-");
|
||||
|
||||
if ((info != null) && (info.length == 2))
|
||||
{
|
||||
int id = 0;
|
||||
int level = 0;
|
||||
try
|
||||
{
|
||||
id = Integer.parseInt(info[0]);
|
||||
level = Integer.parseInt(info[1]);
|
||||
}
|
||||
catch (Exception nfe)
|
||||
{
|
||||
// Incorrect syntax, dont add new skill
|
||||
_log.info(StringUtil.concat("> Couldnt parse ", skill, " in armor enchant skills! item ", toString()));
|
||||
}
|
||||
if ((id > 0) && (level > 0))
|
||||
{
|
||||
_enchant4Skill = new SkillHolder(id, level);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of the armor.
|
||||
* @return L2ArmorType
|
||||
*/
|
||||
@Override
|
||||
public L2ArmorType getItemType()
|
||||
{
|
||||
return _type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ID of the item after applying the mask.
|
||||
* @return int : ID of the item
|
||||
*/
|
||||
@Override
|
||||
public final int getItemMask()
|
||||
{
|
||||
return getItemType().mask();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns skill that player get when has equiped armor +4 or more
|
||||
* @return
|
||||
*/
|
||||
public L2Skill getEnchant4Skill()
|
||||
{
|
||||
if (_enchant4Skill == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return _enchant4Skill.getSkill();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns array of Func objects containing the list of functions used by the armor
|
||||
* @param instance : L2ItemInstance pointing out the armor
|
||||
* @param player : L2Character pointing out the player
|
||||
* @return Func[] : array of functions
|
||||
*/
|
||||
@Override
|
||||
public Func[] getStatFuncs(L2ItemInstance instance, L2Character player)
|
||||
{
|
||||
if ((_funcTemplates == null) || (_funcTemplates.length == 0))
|
||||
{
|
||||
return _emptyFunctionSet;
|
||||
}
|
||||
|
||||
ArrayList<Func> funcs = new ArrayList<>(_funcTemplates.length);
|
||||
|
||||
Env env = new Env();
|
||||
env.player = player;
|
||||
env.item = instance;
|
||||
|
||||
Func f;
|
||||
|
||||
for (FuncTemplate t : _funcTemplates)
|
||||
{
|
||||
|
||||
f = t.getFunc(env, instance);
|
||||
if (f != null)
|
||||
{
|
||||
funcs.add(f);
|
||||
}
|
||||
}
|
||||
|
||||
return funcs.toArray(new Func[funcs.size()]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* 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 com.l2jserver.gameserver.templates.item;
|
||||
|
||||
/**
|
||||
* Description of Armor Type
|
||||
*/
|
||||
|
||||
public enum L2ArmorType implements L2ItemType
|
||||
{
|
||||
NONE("None"),
|
||||
LIGHT("Light"),
|
||||
HEAVY("Heavy"),
|
||||
MAGIC("Magic"),
|
||||
SIGIL("Sigil"),
|
||||
|
||||
// L2J CUSTOM
|
||||
SHIELD("Shield");
|
||||
|
||||
final int _mask;
|
||||
final String _name;
|
||||
|
||||
/**
|
||||
* Constructor of the L2ArmorType.
|
||||
* @param id : int designating the ID of the ArmorType
|
||||
* @param name : String designating the name of the ArmorType
|
||||
*/
|
||||
L2ArmorType(String name)
|
||||
{
|
||||
_mask = 1 << (ordinal() + L2WeaponType.values().length);
|
||||
_name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ID of the ArmorType after applying a mask.
|
||||
* @return int : ID of the ArmorType after mask
|
||||
*/
|
||||
@Override
|
||||
public int mask()
|
||||
{
|
||||
return _mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the ArmorType
|
||||
* @return String
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
* 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 com.l2jserver.gameserver.templates.item;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.l2jserver.gameserver.model.L2ExtractableProduct;
|
||||
import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
|
||||
import com.l2jserver.gameserver.templates.StatsSet;
|
||||
import com.l2jserver.util.StringUtil;
|
||||
|
||||
/**
|
||||
* This class is dedicated to the management of EtcItem.
|
||||
* @version $Revision: 1.2.2.1.2.3 $ $Date: 2005/03/27 15:30:10 $
|
||||
*/
|
||||
public final class L2EtcItem extends L2Item
|
||||
{
|
||||
// private final String[] _skill;
|
||||
private String _handler;
|
||||
private final int _sharedReuseGroup;
|
||||
private L2EtcItemType _type;
|
||||
private final boolean _isBlessed;
|
||||
private final List<L2ExtractableProduct> _extractableItems;
|
||||
|
||||
/**
|
||||
* Constructor for EtcItem.
|
||||
* @see L2Item constructor
|
||||
* @param type : L2EtcItemType designating the type of object Etc
|
||||
* @param set : StatsSet designating the set of couples (key,value) for description of the Etc
|
||||
*/
|
||||
public L2EtcItem(StatsSet set)
|
||||
{
|
||||
super(set);
|
||||
_type = L2EtcItemType.valueOf(set.getString("etcitem_type", "none").toUpperCase());
|
||||
|
||||
// l2j custom - L2EtcItemType.SHOT
|
||||
switch (getDefaultAction())
|
||||
{
|
||||
case soulshot:
|
||||
case summon_soulshot:
|
||||
case summon_spiritshot:
|
||||
case spiritshot:
|
||||
{
|
||||
_type = L2EtcItemType.SHOT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_ex_immediate_effect())
|
||||
{
|
||||
_type = L2EtcItemType.HERB;
|
||||
}
|
||||
|
||||
_type1 = L2Item.TYPE1_ITEM_QUESTITEM_ADENA;
|
||||
_type2 = L2Item.TYPE2_OTHER; // default is other
|
||||
|
||||
if (isQuestItem())
|
||||
{
|
||||
_type2 = L2Item.TYPE2_QUEST;
|
||||
}
|
||||
else if ((getItemId() == PcInventory.ADENA_ID) || (getItemId() == PcInventory.ANCIENT_ADENA_ID))
|
||||
{
|
||||
_type2 = L2Item.TYPE2_MONEY;
|
||||
}
|
||||
|
||||
_handler = set.getString("handler", null); // ! null !
|
||||
_sharedReuseGroup = set.getInteger("shared_reuse_group", -1);
|
||||
_isBlessed = set.getBool("blessed", false);
|
||||
|
||||
// extractable
|
||||
String capsuled_items = set.getString("capsuled_items", null);
|
||||
if (capsuled_items != null)
|
||||
{
|
||||
String[] split = capsuled_items.split(";");
|
||||
_extractableItems = new ArrayList<>(split.length);
|
||||
for (String part : split)
|
||||
{
|
||||
if (part.trim().isEmpty())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
String[] data = part.split(",");
|
||||
if (data.length != 4)
|
||||
{
|
||||
_log.info(StringUtil.concat("> Couldnt parse ", part, " in capsuled_items! item ", toString()));
|
||||
continue;
|
||||
}
|
||||
int itemId = Integer.parseInt(data[0]);
|
||||
int min = Integer.parseInt(data[1]);
|
||||
int max = Integer.parseInt(data[2]);
|
||||
double chance = Double.parseDouble(data[3]);
|
||||
if (max < min)
|
||||
{
|
||||
_log.info(StringUtil.concat("> Max amount < Min amount in ", part, ", item ", toString()));
|
||||
continue;
|
||||
}
|
||||
L2ExtractableProduct product = new L2ExtractableProduct(itemId, min, max, chance);
|
||||
_extractableItems.add(product);
|
||||
}
|
||||
((ArrayList<?>) _extractableItems).trimToSize();
|
||||
|
||||
// check for handler
|
||||
if (_handler == null)
|
||||
{
|
||||
// _log.warning("Item "+this+ " define capsuled_items but missing handler.");
|
||||
_handler = "ExtractableItems";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_extractableItems = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of Etc Item
|
||||
* @return L2EtcItemType
|
||||
*/
|
||||
@Override
|
||||
public L2EtcItemType getItemType()
|
||||
{
|
||||
return _type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the item is consumable
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public final boolean isConsumable()
|
||||
{
|
||||
return ((getItemType() == L2EtcItemType.SHOT) || (getItemType() == L2EtcItemType.POTION)); // || (type == L2EtcItemType.SCROLL));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ID of the Etc item after applying the mask.
|
||||
* @return int : ID of the EtcItem
|
||||
*/
|
||||
@Override
|
||||
public int getItemMask()
|
||||
{
|
||||
return getItemType().mask();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return handler name. null if no handler for item
|
||||
* @return String
|
||||
*/
|
||||
public String getHandlerName()
|
||||
{
|
||||
return _handler;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public int getSharedReuseGroup()
|
||||
{
|
||||
return _sharedReuseGroup;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public final boolean isBlessed()
|
||||
{
|
||||
return _isBlessed;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the _extractable_items
|
||||
*/
|
||||
public List<L2ExtractableProduct> getExtractableItems()
|
||||
{
|
||||
return _extractableItems;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* 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 com.l2jserver.gameserver.templates.item;
|
||||
|
||||
/**
|
||||
* Description of EtcItem Type
|
||||
*/
|
||||
|
||||
public enum L2EtcItemType implements L2ItemType
|
||||
{
|
||||
NONE(1, "none"),
|
||||
ARROW(2, "arrow"),
|
||||
POTION(3, "potion"),
|
||||
SCRL_ENCHANT_WP(4, "scrl_enchant_wp"),
|
||||
SCRL_ENCHANT_AM(5, "scrl_enchant_am"),
|
||||
SCROLL(6, "scroll"),
|
||||
RECIPE(7, "recipe"),
|
||||
MATERIAL(8, "material"),
|
||||
PET_COLLAR(9, "pet_collar"),
|
||||
CASTLE_GUARD(10, "castle_guard"),
|
||||
LOTTO(11, "lotto"),
|
||||
RACE_TICKET(12, "race_ticket"),
|
||||
DYE(13, "dye"),
|
||||
SEED(14, "seed"),
|
||||
CROP(15, "crop"),
|
||||
MATURECROP(16, "maturecrop"),
|
||||
HARVEST(17, "harvest"),
|
||||
SEED2(18, "seed2"),
|
||||
TICKET_OF_LORD(19, "ticket_of_lord"),
|
||||
LURE(20, "lure"),
|
||||
BLESS_SCRL_ENCHANT_WP(21, "bless_scrl_enchant_wp"),
|
||||
BLESS_SCRL_ENCHANT_AM(22, "bless_scrl_enchant_am"),
|
||||
COUPON(23, "coupon"),
|
||||
ELIXIR(24, "elixir"),
|
||||
SCRL_ENCHANT_ATTR(25, "scrl_enchant_attr"),
|
||||
BOLT(26, "bolt"),
|
||||
SCRL_INC_ENCHANT_PROP_WP(27, "scrl_inc_enchant_prop_wp"),
|
||||
SCRL_INC_ENCHANT_PROP_AM(28, "scrl_inc_enchant_prop_am"),
|
||||
ANCIENT_CRYSTAL_ENCHANT_WP(29, "ancient_crystal_enchant_wp"),
|
||||
ANCIENT_CRYSTAL_ENCHANT_AM(30, "ancient_crystal_enchant_am"),
|
||||
RUNE_SELECT(31, "rune_select"),
|
||||
RUNE(32, "rune"),
|
||||
|
||||
// L2J CUSTOM, BACKWARD COMPATIBILITY
|
||||
SHOT(33, "Shot"),
|
||||
HERB(34, "Herb");
|
||||
|
||||
final int _id;
|
||||
final String _name;
|
||||
|
||||
/**
|
||||
* Constructor of the L2EtcItemType.
|
||||
* @param id : int designating the ID of the EtcItemType
|
||||
* @param name : String designating the name of the EtcItemType
|
||||
*/
|
||||
L2EtcItemType(int id, String name)
|
||||
{
|
||||
_id = id;
|
||||
_name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ID of the item after applying the mask.
|
||||
* @return int : ID of the item
|
||||
*/
|
||||
@Override
|
||||
public int mask()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the EtcItemType
|
||||
* @return String
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* 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 com.l2jserver.gameserver.templates.item;
|
||||
|
||||
import com.l2jserver.gameserver.templates.StatsSet;
|
||||
|
||||
/**
|
||||
* This class ...
|
||||
* @version $Revision$ $Date$
|
||||
*/
|
||||
public class L2Henna
|
||||
{
|
||||
private final int symbolId;
|
||||
private final int dye;
|
||||
private final int price;
|
||||
private final int amount;
|
||||
private final int statINT;
|
||||
private final int statSTR;
|
||||
private final int statCON;
|
||||
private final int statMEM;
|
||||
private final int statDEX;
|
||||
private final int statWIT;
|
||||
|
||||
public L2Henna(StatsSet set)
|
||||
{
|
||||
symbolId = set.getInteger("symbol_id");
|
||||
dye = set.getInteger("dye");
|
||||
price = set.getInteger("price");
|
||||
amount = set.getInteger("amount");
|
||||
statINT = set.getInteger("stat_INT");
|
||||
statSTR = set.getInteger("stat_STR");
|
||||
statCON = set.getInteger("stat_CON");
|
||||
statMEM = set.getInteger("stat_MEM");
|
||||
statDEX = set.getInteger("stat_DEX");
|
||||
statWIT = set.getInteger("stat_WIT");
|
||||
}
|
||||
|
||||
public int getSymbolId()
|
||||
{
|
||||
return symbolId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public int getDyeId()
|
||||
{
|
||||
return dye;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public int getPrice()
|
||||
{
|
||||
return price;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public int getAmountDyeRequire()
|
||||
{
|
||||
return amount;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public int getStatINT()
|
||||
{
|
||||
return statINT;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public int getStatSTR()
|
||||
{
|
||||
return statSTR;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public int getStatCON()
|
||||
{
|
||||
return statCON;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public int getStatMEM()
|
||||
{
|
||||
return statMEM;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public int getStatDEX()
|
||||
{
|
||||
return statDEX;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public int getStatWIT()
|
||||
{
|
||||
return statWIT;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,985 @@
|
||||
/*
|
||||
* 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 com.l2jserver.gameserver.templates.item;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javolution.util.FastList;
|
||||
|
||||
import com.l2jserver.Config;
|
||||
import com.l2jserver.gameserver.datatables.ItemTable;
|
||||
import com.l2jserver.gameserver.model.Elementals;
|
||||
import com.l2jserver.gameserver.model.L2Effect;
|
||||
import com.l2jserver.gameserver.model.L2ItemInstance;
|
||||
import com.l2jserver.gameserver.model.L2Object;
|
||||
import com.l2jserver.gameserver.model.actor.L2Character;
|
||||
import com.l2jserver.gameserver.model.actor.L2Summon;
|
||||
import com.l2jserver.gameserver.network.SystemMessageId;
|
||||
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
|
||||
import com.l2jserver.gameserver.skills.Env;
|
||||
import com.l2jserver.gameserver.skills.SkillHolder;
|
||||
import com.l2jserver.gameserver.skills.conditions.Condition;
|
||||
import com.l2jserver.gameserver.skills.conditions.ConditionLogicOr;
|
||||
import com.l2jserver.gameserver.skills.conditions.ConditionPetType;
|
||||
import com.l2jserver.gameserver.skills.funcs.Func;
|
||||
import com.l2jserver.gameserver.skills.funcs.FuncTemplate;
|
||||
import com.l2jserver.gameserver.templates.StatsSet;
|
||||
import com.l2jserver.gameserver.templates.effects.EffectTemplate;
|
||||
import com.l2jserver.util.StringUtil;
|
||||
|
||||
/**
|
||||
* This class contains all informations concerning the item (weapon, armor, etc).<BR>
|
||||
* Mother class of : <LI>L2Armor</LI> <LI>L2EtcItem</LI> <LI>L2Weapon</LI>
|
||||
* @version $Revision: 1.7.2.2.2.5 $ $Date: 2005/04/06 18:25:18 $
|
||||
*/
|
||||
public abstract class L2Item
|
||||
{
|
||||
public static final int TYPE1_WEAPON_RING_EARRING_NECKLACE = 0;
|
||||
public static final int TYPE1_SHIELD_ARMOR = 1;
|
||||
public static final int TYPE1_ITEM_QUESTITEM_ADENA = 4;
|
||||
|
||||
public static final int TYPE2_WEAPON = 0;
|
||||
public static final int TYPE2_SHIELD_ARMOR = 1;
|
||||
public static final int TYPE2_ACCESSORY = 2;
|
||||
public static final int TYPE2_QUEST = 3;
|
||||
public static final int TYPE2_MONEY = 4;
|
||||
public static final int TYPE2_OTHER = 5;
|
||||
|
||||
public static final int WOLF = 0x1;
|
||||
public static final int HATCHLING = 0x2;
|
||||
public static final int STRIDER = 0x4;
|
||||
public static final int BABY = 0x8;
|
||||
public static final int IMPROVED_BABY = 0x10;
|
||||
public static final int GROWN_WOLF = 0x20;
|
||||
public static final int ALL_WOLF = 0x21;
|
||||
public static final int ALL_PET = 0x3F;
|
||||
|
||||
public static final int SLOT_NONE = 0x0000;
|
||||
public static final int SLOT_UNDERWEAR = 0x0001;
|
||||
public static final int SLOT_R_EAR = 0x0002;
|
||||
public static final int SLOT_L_EAR = 0x0004;
|
||||
public static final int SLOT_LR_EAR = 0x00006;
|
||||
public static final int SLOT_NECK = 0x0008;
|
||||
public static final int SLOT_R_FINGER = 0x0010;
|
||||
public static final int SLOT_L_FINGER = 0x0020;
|
||||
public static final int SLOT_LR_FINGER = 0x0030;
|
||||
public static final int SLOT_HEAD = 0x0040;
|
||||
public static final int SLOT_R_HAND = 0x0080;
|
||||
public static final int SLOT_L_HAND = 0x0100;
|
||||
public static final int SLOT_GLOVES = 0x0200;
|
||||
public static final int SLOT_CHEST = 0x0400;
|
||||
public static final int SLOT_LEGS = 0x0800;
|
||||
public static final int SLOT_FEET = 0x1000;
|
||||
public static final int SLOT_BACK = 0x2000;
|
||||
public static final int SLOT_LR_HAND = 0x4000;
|
||||
public static final int SLOT_FULL_ARMOR = 0x8000;
|
||||
public static final int SLOT_HAIR = 0x010000;
|
||||
public static final int SLOT_ALLDRESS = 0x020000;
|
||||
public static final int SLOT_HAIR2 = 0x040000;
|
||||
public static final int SLOT_HAIRALL = 0x080000;
|
||||
public static final int SLOT_R_BRACELET = 0x100000;
|
||||
public static final int SLOT_L_BRACELET = 0x200000;
|
||||
public static final int SLOT_DECO = 0x400000;
|
||||
public static final int SLOT_BELT = 0x10000000;
|
||||
public static final int SLOT_WOLF = -100;
|
||||
public static final int SLOT_HATCHLING = -101;
|
||||
public static final int SLOT_STRIDER = -102;
|
||||
public static final int SLOT_BABYPET = -103;
|
||||
public static final int SLOT_GREATWOLF = -104;
|
||||
|
||||
public static final int SLOT_MULTI_ALLWEAPON = SLOT_LR_HAND | SLOT_R_HAND;
|
||||
|
||||
public static final int MATERIAL_STEEL = 0x00; // ??
|
||||
public static final int MATERIAL_FINE_STEEL = 0x01; // ??
|
||||
public static final int MATERIAL_BLOOD_STEEL = 0x02; // ??
|
||||
public static final int MATERIAL_BRONZE = 0x03; // ??
|
||||
public static final int MATERIAL_SILVER = 0x04; // ??
|
||||
public static final int MATERIAL_GOLD = 0x05; // ??
|
||||
public static final int MATERIAL_MITHRIL = 0x06; // ??
|
||||
public static final int MATERIAL_ORIHARUKON = 0x07; // ??
|
||||
public static final int MATERIAL_PAPER = 0x08; // ??
|
||||
public static final int MATERIAL_WOOD = 0x09; // ??
|
||||
public static final int MATERIAL_CLOTH = 0x0a; // ??
|
||||
public static final int MATERIAL_LEATHER = 0x0b; // ??
|
||||
public static final int MATERIAL_BONE = 0x0c; // ??
|
||||
public static final int MATERIAL_HORN = 0x0d; // ??
|
||||
public static final int MATERIAL_DAMASCUS = 0x0e; // ??
|
||||
public static final int MATERIAL_ADAMANTAITE = 0x0f; // ??
|
||||
public static final int MATERIAL_CHRYSOLITE = 0x10; // ??
|
||||
public static final int MATERIAL_CRYSTAL = 0x11; // ??
|
||||
public static final int MATERIAL_LIQUID = 0x12; // ??
|
||||
public static final int MATERIAL_SCALE_OF_DRAGON = 0x13; // ??
|
||||
public static final int MATERIAL_DYESTUFF = 0x14; // ??
|
||||
public static final int MATERIAL_COBWEB = 0x15; // ??
|
||||
public static final int MATERIAL_SEED = 0x16; // ??
|
||||
public static final int MATERIAL_FISH = 0x17; // ??
|
||||
public static final int MATERIAL_RUNE_XP = 0x18; // ??
|
||||
public static final int MATERIAL_RUNE_SP = 0x19; // ??
|
||||
public static final int MATERIAL_RUNE_PENALTY = 0x20; // ??
|
||||
|
||||
public static final int CRYSTAL_NONE = 0x00; // ??
|
||||
public static final int CRYSTAL_D = 0x01; // ??
|
||||
public static final int CRYSTAL_C = 0x02; // ??
|
||||
public static final int CRYSTAL_B = 0x03; // ??
|
||||
public static final int CRYSTAL_A = 0x04; // ??
|
||||
public static final int CRYSTAL_S = 0x05; // ??
|
||||
public static final int CRYSTAL_S80 = 0x06; // ??
|
||||
public static final int CRYSTAL_S84 = 0x07; // ??
|
||||
|
||||
private static final int[] crystalItemId =
|
||||
{
|
||||
0,
|
||||
1458,
|
||||
1459,
|
||||
1460,
|
||||
1461,
|
||||
1462,
|
||||
1462,
|
||||
1462
|
||||
};
|
||||
private static final int[] crystalEnchantBonusArmor =
|
||||
{
|
||||
0,
|
||||
11,
|
||||
6,
|
||||
11,
|
||||
19,
|
||||
25,
|
||||
25,
|
||||
25
|
||||
};
|
||||
private static final int[] crystalEnchantBonusWeapon =
|
||||
{
|
||||
0,
|
||||
90,
|
||||
45,
|
||||
67,
|
||||
144,
|
||||
250,
|
||||
250,
|
||||
250
|
||||
};
|
||||
|
||||
private final int _itemId;
|
||||
private final String _name;
|
||||
private final String _icon;
|
||||
private final int _weight;
|
||||
private final boolean _stackable;
|
||||
private final int _materialType;
|
||||
private final int _crystalType; // default to none-grade
|
||||
private final int _duration;
|
||||
private final int _time;
|
||||
private final int _bodyPart;
|
||||
private final int _referencePrice;
|
||||
private final int _crystalCount;
|
||||
private final boolean _sellable;
|
||||
private final boolean _dropable;
|
||||
private final boolean _destroyable;
|
||||
private final boolean _tradeable;
|
||||
private final boolean _depositable;
|
||||
private final boolean _questItem;
|
||||
private final boolean _common;
|
||||
private final boolean _heroItem;
|
||||
private final boolean _pvpItem;
|
||||
private final boolean _ex_immediate_effect;
|
||||
private final L2ActionType _defaultAction;
|
||||
|
||||
protected int _type1; // needed for item list (inventory)
|
||||
protected int _type2; // different lists for armor, weapon, etc
|
||||
protected Elementals[] _elementals = null;
|
||||
protected FuncTemplate[] _funcTemplates;
|
||||
protected EffectTemplate[] _effectTemplates;
|
||||
protected List<Condition> _preConditions;
|
||||
private SkillHolder[] _skillHolder;
|
||||
|
||||
protected static final Func[] _emptyFunctionSet = new Func[0];
|
||||
protected static final L2Effect[] _emptyEffectSet = new L2Effect[0];
|
||||
|
||||
protected static final Logger _log = Logger.getLogger(L2Item.class.getName());
|
||||
|
||||
/**
|
||||
* Constructor of the L2Item that fill class variables.<BR>
|
||||
* <BR>
|
||||
* @param set : StatsSet corresponding to a set of couples (key,value) for description of the item
|
||||
*/
|
||||
protected L2Item(StatsSet set)
|
||||
{
|
||||
_itemId = set.getInteger("item_id");
|
||||
_name = set.getString("name");
|
||||
_icon = set.getString("icon", null);
|
||||
_weight = set.getInteger("weight", 0);
|
||||
_materialType = ItemTable._materials.get(set.getString("material", "steel")); // default is steel, yeah and what?
|
||||
_duration = set.getInteger("duration", -1);
|
||||
_time = set.getInteger("time", -1);
|
||||
_bodyPart = ItemTable._slots.get(set.getString("bodypart", "none"));
|
||||
_referencePrice = set.getInteger("price", 0);
|
||||
_crystalType = ItemTable._crystalTypes.get(set.getString("crystal_type", "none")); // default to none-grade
|
||||
_crystalCount = set.getInteger("crystal_count", 0);
|
||||
|
||||
_stackable = set.getBool("is_stackable", false);
|
||||
_sellable = set.getBool("is_sellable", true);
|
||||
_dropable = set.getBool("is_dropable", true);
|
||||
_destroyable = set.getBool("is_destroyable", true);
|
||||
_tradeable = set.getBool("is_tradable", true);
|
||||
_depositable = set.getBool("is_depositable", true);
|
||||
_questItem = set.getBool("is_questitem", false);
|
||||
|
||||
// _immediate_effect - herb
|
||||
_ex_immediate_effect = set.getInteger("ex_immediate_effect", 0) > 0;
|
||||
// used for custom type select
|
||||
_defaultAction = set.getEnum("default_action", L2ActionType.class, L2ActionType.none);
|
||||
|
||||
// TODO cleanup + finish
|
||||
String equip_condition = set.getString("equip_condition", null);
|
||||
if (equip_condition != null)
|
||||
{
|
||||
// pet conditions
|
||||
ConditionLogicOr cond = new ConditionLogicOr();
|
||||
if (equip_condition.contains("all_wolf_group"))
|
||||
{
|
||||
cond.add(new ConditionPetType(ALL_WOLF));
|
||||
}
|
||||
if (equip_condition.contains("hatchling_group"))
|
||||
{
|
||||
cond.add(new ConditionPetType(HATCHLING));
|
||||
}
|
||||
if (equip_condition.contains("strider"))
|
||||
{
|
||||
cond.add(new ConditionPetType(STRIDER));
|
||||
}
|
||||
if (equip_condition.contains("baby_pet_group"))
|
||||
{
|
||||
cond.add(new ConditionPetType(BABY));
|
||||
}
|
||||
if (equip_condition.contains("upgrade_baby_pet_group"))
|
||||
{
|
||||
cond.add(new ConditionPetType(IMPROVED_BABY));
|
||||
}
|
||||
if (equip_condition.contains("grown_up_wolf_group"))
|
||||
{
|
||||
cond.add(new ConditionPetType(GROWN_WOLF));
|
||||
}
|
||||
if (equip_condition.contains("item_equip_pet_group"))
|
||||
{
|
||||
cond.add(new ConditionPetType(ALL_PET));
|
||||
}
|
||||
|
||||
if (cond.conditions.length > 0)
|
||||
{
|
||||
attach(cond);
|
||||
}
|
||||
}
|
||||
|
||||
String skills = set.getString("item_skill", null);
|
||||
if (skills != null)
|
||||
{
|
||||
String[] skillsSplit = skills.split(";");
|
||||
_skillHolder = new SkillHolder[skillsSplit.length];
|
||||
int used = 0;
|
||||
|
||||
for (String element : skillsSplit)
|
||||
{
|
||||
try
|
||||
{
|
||||
String[] skillSplit = element.split("-");
|
||||
int id = Integer.parseInt(skillSplit[0]);
|
||||
int level = Integer.parseInt(skillSplit[1]);
|
||||
|
||||
if (id == 0)
|
||||
{
|
||||
_log.info(StringUtil.concat("Ignoring item_skill(", element, ") for item ", toString(), ". Skill id is 0!"));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (level == 0)
|
||||
{
|
||||
_log.info(StringUtil.concat("Ignoring item_skill(", element, ") for item ", toString(), ". Skill level is 0!"));
|
||||
continue;
|
||||
}
|
||||
|
||||
_skillHolder[used] = new SkillHolder(id, level);
|
||||
++used;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_log.warning(StringUtil.concat("Failed to parse item_skill(", element, ") for item ", toString(), "! Format: SkillId0-SkillLevel0[;SkillIdN-SkillLevelN]"));
|
||||
}
|
||||
}
|
||||
|
||||
// this is only loading? just don't leave a null or use a collection?
|
||||
if (used != _skillHolder.length)
|
||||
{
|
||||
SkillHolder[] skillHolder = new SkillHolder[used];
|
||||
System.arraycopy(_skillHolder, 0, skillHolder, 0, used);
|
||||
_skillHolder = skillHolder;
|
||||
}
|
||||
}
|
||||
|
||||
_common = ((_itemId >= 11605) && (_itemId <= 12361));
|
||||
_heroItem = ((_itemId >= 6611) && (_itemId <= 6621)) || ((_itemId >= 9388) && (_itemId <= 9390)) || (_itemId == 6842);
|
||||
_pvpItem = ((_itemId >= 10667) && (_itemId <= 10835)) || ((_itemId >= 12852) && (_itemId <= 12977)) || ((_itemId >= 14363) && (_itemId <= 14525)) || (_itemId == 14528) || (_itemId == 14529) || (_itemId == 14558) || ((_itemId >= 15913) && (_itemId <= 16024)) || ((_itemId >= 16134) && (_itemId <= 16147)) || (_itemId == 16149) || (_itemId == 16151) || (_itemId == 16153) || (_itemId == 16155) || (_itemId == 16157) || (_itemId == 16159) || ((_itemId >= 16168) && (_itemId <= 16176)) || ((_itemId >= 16179) && (_itemId <= 16220));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the itemType.
|
||||
* @return Enum
|
||||
*/
|
||||
public abstract L2ItemType getItemType();
|
||||
|
||||
/**
|
||||
* Returns the duration of the item
|
||||
* @return int
|
||||
*/
|
||||
public final int getDuration()
|
||||
{
|
||||
return _duration;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time of the item
|
||||
* @return int
|
||||
*/
|
||||
public final int getTime()
|
||||
{
|
||||
return _time;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ID of the iden
|
||||
* @return int
|
||||
*/
|
||||
public final int getItemId()
|
||||
{
|
||||
return _itemId;
|
||||
}
|
||||
|
||||
public abstract int getItemMask();
|
||||
|
||||
/**
|
||||
* Return the type of material of the item
|
||||
* @return int
|
||||
*/
|
||||
public final int getMaterialType()
|
||||
{
|
||||
return _materialType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type 2 of the item
|
||||
* @return int
|
||||
*/
|
||||
public final int getType2()
|
||||
{
|
||||
return _type2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the weight of the item
|
||||
* @return int
|
||||
*/
|
||||
public final int getWeight()
|
||||
{
|
||||
return _weight;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the item is crystallizable
|
||||
* @return boolean
|
||||
*/
|
||||
public final boolean isCrystallizable()
|
||||
{
|
||||
return (_crystalType != L2Item.CRYSTAL_NONE) && (_crystalCount > 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the type of crystal if item is crystallizable
|
||||
* @return int
|
||||
*/
|
||||
public final int getCrystalType()
|
||||
{
|
||||
return _crystalType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the type of crystal if item is crystallizable
|
||||
* @return int
|
||||
*/
|
||||
public final int getCrystalItemId()
|
||||
{
|
||||
return crystalItemId[_crystalType];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the grade of the item.<BR>
|
||||
* <BR>
|
||||
* <U><I>Concept :</I></U><BR>
|
||||
* In fact, this fucntion returns the type of crystal of the item.
|
||||
* @return int
|
||||
*/
|
||||
public final int getItemGrade()
|
||||
{
|
||||
return getCrystalType();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the grade of the item.<BR>
|
||||
* <BR>
|
||||
* For grades S80 and S84 return S
|
||||
* @return int
|
||||
*/
|
||||
public final int getItemGradeSPlus()
|
||||
{
|
||||
switch (getItemGrade())
|
||||
{
|
||||
case CRYSTAL_S80:
|
||||
case CRYSTAL_S84:
|
||||
return CRYSTAL_S;
|
||||
default:
|
||||
return getItemGrade();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the quantity of crystals for crystallization
|
||||
* @return int
|
||||
*/
|
||||
public final int getCrystalCount()
|
||||
{
|
||||
return _crystalCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the quantity of crystals for crystallization on specific enchant level
|
||||
* @return int
|
||||
*/
|
||||
public final int getCrystalCount(int enchantLevel)
|
||||
{
|
||||
if (enchantLevel > 3)
|
||||
{
|
||||
switch (_type2)
|
||||
{
|
||||
case TYPE2_SHIELD_ARMOR:
|
||||
case TYPE2_ACCESSORY:
|
||||
return _crystalCount + (crystalEnchantBonusArmor[getCrystalType()] * ((3 * enchantLevel) - 6));
|
||||
case TYPE2_WEAPON:
|
||||
return _crystalCount + (crystalEnchantBonusWeapon[getCrystalType()] * ((2 * enchantLevel) - 3));
|
||||
default:
|
||||
return _crystalCount;
|
||||
}
|
||||
}
|
||||
else if (enchantLevel > 0)
|
||||
{
|
||||
switch (_type2)
|
||||
{
|
||||
case TYPE2_SHIELD_ARMOR:
|
||||
case TYPE2_ACCESSORY:
|
||||
return _crystalCount + (crystalEnchantBonusArmor[getCrystalType()] * enchantLevel);
|
||||
case TYPE2_WEAPON:
|
||||
return _crystalCount + (crystalEnchantBonusWeapon[getCrystalType()] * enchantLevel);
|
||||
default:
|
||||
return _crystalCount;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return _crystalCount;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the item
|
||||
* @return String
|
||||
*/
|
||||
public final String getName()
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the base elemental of the item
|
||||
* @return Elementals
|
||||
*/
|
||||
public final Elementals[] getElementals()
|
||||
{
|
||||
return _elementals;
|
||||
}
|
||||
|
||||
public Elementals getElemental(byte attribute)
|
||||
{
|
||||
for (Elementals elm : _elementals)
|
||||
{
|
||||
if (elm.getElement() == attribute)
|
||||
{
|
||||
return elm;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the base elemental of the item
|
||||
*/
|
||||
public void setElementals(Elementals element)
|
||||
{
|
||||
if (_elementals == null)
|
||||
{
|
||||
_elementals = new Elementals[1];
|
||||
_elementals[0] = element;
|
||||
}
|
||||
else
|
||||
{
|
||||
Elementals elm = getElemental(element.getElement());
|
||||
if (elm != null)
|
||||
{
|
||||
elm.setValue(element.getValue());
|
||||
}
|
||||
else
|
||||
{
|
||||
elm = element;
|
||||
Elementals[] array = new Elementals[_elementals.length + 1];
|
||||
System.arraycopy(_elementals, 0, array, 0, _elementals.length);
|
||||
array[_elementals.length] = elm;
|
||||
_elementals = array;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the part of the body used with the item.
|
||||
* @return int
|
||||
*/
|
||||
public final int getBodyPart()
|
||||
{
|
||||
return _bodyPart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type 1 of the item
|
||||
* @return int
|
||||
*/
|
||||
public final int getType1()
|
||||
{
|
||||
return _type1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the item is stackable
|
||||
* @return boolean
|
||||
*/
|
||||
public final boolean isStackable()
|
||||
{
|
||||
return _stackable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the item is consumable
|
||||
* @return boolean
|
||||
*/
|
||||
public boolean isConsumable()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isEquipable()
|
||||
{
|
||||
return (getBodyPart() != 0) && !(getItemType() instanceof L2EtcItemType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the price of reference of the item
|
||||
* @return int
|
||||
*/
|
||||
public final int getReferencePrice()
|
||||
{
|
||||
return (isConsumable() ? (int) (_referencePrice * Config.RATE_CONSUMABLE_COST) : _referencePrice);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the item can be sold
|
||||
* @return boolean
|
||||
*/
|
||||
public final boolean isSellable()
|
||||
{
|
||||
return _sellable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the item can dropped
|
||||
* @return boolean
|
||||
*/
|
||||
public final boolean isDropable()
|
||||
{
|
||||
return _dropable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the item can destroy
|
||||
* @return boolean
|
||||
*/
|
||||
public final boolean isDestroyable()
|
||||
{
|
||||
return _destroyable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the item can add to trade
|
||||
* @return boolean
|
||||
*/
|
||||
public final boolean isTradeable()
|
||||
{
|
||||
return _tradeable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the item can be put into warehouse
|
||||
* @return boolean
|
||||
*/
|
||||
public final boolean isDepositable()
|
||||
{
|
||||
return _depositable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if item is common
|
||||
* @return boolean
|
||||
*/
|
||||
public final boolean isCommon()
|
||||
{
|
||||
return _common;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if item is hero-only
|
||||
* @return
|
||||
*/
|
||||
public final boolean isHeroItem()
|
||||
{
|
||||
return _heroItem;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if item is pvp
|
||||
* @return
|
||||
*/
|
||||
public final boolean isPvpItem()
|
||||
{
|
||||
return _pvpItem;
|
||||
}
|
||||
|
||||
public boolean isPotion()
|
||||
{
|
||||
return (getItemType() == L2EtcItemType.POTION);
|
||||
}
|
||||
|
||||
public boolean isElixir()
|
||||
{
|
||||
return (getItemType() == L2EtcItemType.ELIXIR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns array of Func objects containing the list of functions used by the item
|
||||
* @param instance : L2ItemInstance pointing out the item
|
||||
* @param player : L2Character pointing out the player
|
||||
* @return Func[] : array of functions
|
||||
*/
|
||||
public Func[] getStatFuncs(L2ItemInstance instance, L2Character player)
|
||||
{
|
||||
if ((_funcTemplates == null) || (_funcTemplates.length == 0))
|
||||
{
|
||||
return _emptyFunctionSet;
|
||||
}
|
||||
|
||||
ArrayList<Func> funcs = new ArrayList<>(_funcTemplates.length);
|
||||
|
||||
Env env = new Env();
|
||||
env.player = player;
|
||||
env.target = player;
|
||||
env.item = instance;
|
||||
|
||||
Func f;
|
||||
|
||||
for (FuncTemplate t : _funcTemplates)
|
||||
{
|
||||
f = t.getFunc(env, this); // skill is owner
|
||||
if (f != null)
|
||||
{
|
||||
funcs.add(f);
|
||||
}
|
||||
}
|
||||
|
||||
if (funcs.isEmpty())
|
||||
{
|
||||
return _emptyFunctionSet;
|
||||
}
|
||||
|
||||
return funcs.toArray(new Func[funcs.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the effects associated with the item.
|
||||
* @param instance : L2ItemInstance pointing out the item
|
||||
* @param player : L2Character pointing out the player
|
||||
* @return L2Effect[] : array of effects generated by the item
|
||||
*/
|
||||
public L2Effect[] getEffects(L2ItemInstance instance, L2Character player)
|
||||
{
|
||||
if ((_effectTemplates == null) || (_effectTemplates.length == 0))
|
||||
{
|
||||
return _emptyEffectSet;
|
||||
}
|
||||
|
||||
FastList<L2Effect> effects = FastList.newInstance();
|
||||
|
||||
Env env = new Env();
|
||||
env.player = player;
|
||||
env.target = player;
|
||||
env.item = instance;
|
||||
|
||||
L2Effect e;
|
||||
|
||||
for (EffectTemplate et : _effectTemplates)
|
||||
{
|
||||
|
||||
e = et.getEffect(env);
|
||||
if (e != null)
|
||||
{
|
||||
e.scheduleEffect();
|
||||
effects.add(e);
|
||||
}
|
||||
}
|
||||
|
||||
if (effects.isEmpty())
|
||||
{
|
||||
return _emptyEffectSet;
|
||||
}
|
||||
|
||||
L2Effect[] result = effects.toArray(new L2Effect[effects.size()]);
|
||||
FastList.recycle(effects);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns effects of skills associated with the item.
|
||||
* @param caster : L2Character pointing out the caster
|
||||
* @param target : L2Character pointing out the target
|
||||
* @return L2Effect[] : array of effects generated by the skill public L2Effect[] getSkillEffects(L2Character caster, L2Character target) { if (_skills == null) return _emptyEffectSet; List<L2Effect> effects = new FastList<L2Effect>(); for (L2Skill skill : _skills) { if
|
||||
* (!skill.checkCondition(caster, target, true)) continue; // Skill condition not met if (target.getFirstEffect(skill.getId()) != null) target.removeEffect(target.getFirstEffect(skill.getId())); for (L2Effect e : skill.getEffects(caster, target)) effects.add(e); } if (effects.isEmpty())
|
||||
* return _emptyEffectSet; return effects.toArray(new L2Effect[effects.size()]); }
|
||||
*/
|
||||
/**
|
||||
* Add the FuncTemplate f to the list of functions used with the item
|
||||
* @param f : FuncTemplate to add
|
||||
*/
|
||||
public void attach(FuncTemplate f)
|
||||
{
|
||||
switch (f.stat)
|
||||
{
|
||||
case FIRE_RES:
|
||||
case FIRE_POWER:
|
||||
setElementals(new Elementals(Elementals.FIRE, (int) f.lambda.calc(null)));
|
||||
break;
|
||||
case WATER_RES:
|
||||
case WATER_POWER:
|
||||
setElementals(new Elementals(Elementals.WATER, (int) f.lambda.calc(null)));
|
||||
break;
|
||||
case WIND_RES:
|
||||
case WIND_POWER:
|
||||
setElementals(new Elementals(Elementals.WIND, (int) f.lambda.calc(null)));
|
||||
break;
|
||||
case EARTH_RES:
|
||||
case EARTH_POWER:
|
||||
setElementals(new Elementals(Elementals.EARTH, (int) f.lambda.calc(null)));
|
||||
break;
|
||||
case HOLY_RES:
|
||||
case HOLY_POWER:
|
||||
setElementals(new Elementals(Elementals.HOLY, (int) f.lambda.calc(null)));
|
||||
break;
|
||||
case DARK_RES:
|
||||
case DARK_POWER:
|
||||
setElementals(new Elementals(Elementals.DARK, (int) f.lambda.calc(null)));
|
||||
break;
|
||||
}
|
||||
// If _functTemplates is empty, create it and add the FuncTemplate f in it
|
||||
if (_funcTemplates == null)
|
||||
{
|
||||
_funcTemplates = new FuncTemplate[]
|
||||
{
|
||||
f
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
int len = _funcTemplates.length;
|
||||
FuncTemplate[] tmp = new FuncTemplate[len + 1];
|
||||
// Definition : arraycopy(array source, begins copy at this position of source, array destination, begins copy at this position in dest,
|
||||
// number of components to be copied)
|
||||
System.arraycopy(_funcTemplates, 0, tmp, 0, len);
|
||||
tmp[len] = f;
|
||||
_funcTemplates = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the EffectTemplate effect to the list of effects generated by the item
|
||||
* @param effect : EffectTemplate
|
||||
*/
|
||||
public void attach(EffectTemplate effect)
|
||||
{
|
||||
if (_effectTemplates == null)
|
||||
{
|
||||
_effectTemplates = new EffectTemplate[]
|
||||
{
|
||||
effect
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
int len = _effectTemplates.length;
|
||||
EffectTemplate[] tmp = new EffectTemplate[len + 1];
|
||||
// Definition : arraycopy(array source, begins copy at this position of source, array destination, begins copy at this position in dest,
|
||||
// number of components to be copied)
|
||||
System.arraycopy(_effectTemplates, 0, tmp, 0, len);
|
||||
tmp[len] = effect;
|
||||
_effectTemplates = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
public final void attach(Condition c)
|
||||
{
|
||||
if (_preConditions == null)
|
||||
{
|
||||
_preConditions = new FastList<>();
|
||||
}
|
||||
if (!_preConditions.contains(c))
|
||||
{
|
||||
_preConditions.add(c);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to retrive skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
|
||||
* @return Skills linked to this item as SkillHolder[]
|
||||
*/
|
||||
public final SkillHolder[] getSkills()
|
||||
{
|
||||
return _skillHolder;
|
||||
}
|
||||
|
||||
public boolean checkCondition(L2Character activeChar, L2Object target, boolean sendMessage)
|
||||
{
|
||||
if (activeChar.isGM() && !Config.GM_ITEM_RESTRICTION)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (_preConditions == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Env env = new Env();
|
||||
env.player = activeChar;
|
||||
if (target instanceof L2Character)
|
||||
{
|
||||
env.target = (L2Character) target;
|
||||
}
|
||||
|
||||
for (Condition preCondition : _preConditions)
|
||||
{
|
||||
if (preCondition == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!preCondition.test(env))
|
||||
{
|
||||
if (activeChar instanceof L2Summon)
|
||||
{
|
||||
activeChar.getActingPlayer().sendPacket(SystemMessage.getSystemMessage(SystemMessageId.PET_CANNOT_USE_ITEM));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sendMessage)
|
||||
{
|
||||
String msg = preCondition.getMessage();
|
||||
int msgId = preCondition.getMessageId();
|
||||
if (msg != null)
|
||||
{
|
||||
activeChar.sendMessage(msg);
|
||||
}
|
||||
else if (msgId != 0)
|
||||
{
|
||||
SystemMessage sm = SystemMessage.getSystemMessage(msgId);
|
||||
if (preCondition.isAddName())
|
||||
{
|
||||
sm.addItemName(_itemId);
|
||||
}
|
||||
activeChar.getActingPlayer().sendPacket(sm);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean isConditionAttached()
|
||||
{
|
||||
return (_preConditions != null) && !_preConditions.isEmpty();
|
||||
}
|
||||
|
||||
public boolean isQuestItem()
|
||||
{
|
||||
return _questItem;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the item
|
||||
* @return String
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return _name + "(" + _itemId + ")";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the _ex_immediate_effect
|
||||
*/
|
||||
public boolean is_ex_immediate_effect()
|
||||
{
|
||||
return _ex_immediate_effect;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the _default_action
|
||||
*/
|
||||
public L2ActionType getDefaultAction()
|
||||
{
|
||||
return _defaultAction;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the icon link in client files.<BR>
|
||||
* Usable in HTML windows.
|
||||
* @return the _icon
|
||||
*/
|
||||
public String getIcon()
|
||||
{
|
||||
return _icon;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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 com.l2jserver.gameserver.templates.item;
|
||||
|
||||
/**
|
||||
* Created for allow comparing different item types
|
||||
* @author DS
|
||||
*/
|
||||
public interface L2ItemType
|
||||
{
|
||||
public int mask();
|
||||
}
|
||||
@@ -0,0 +1,292 @@
|
||||
/*
|
||||
* 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 com.l2jserver.gameserver.templates.item;
|
||||
|
||||
import com.l2jserver.gameserver.model.L2ItemInstance;
|
||||
|
||||
/**
|
||||
* This class contains L2ItemInstance<BR>
|
||||
* Use to sort L2ItemInstance of : <LI>L2Armor</LI> <LI>L2EtcItem</LI> <LI>L2Weapon</LI>
|
||||
* @version $Revision: 1.7.2.2.2.5 $ $Date: 2005/04/06 18:25:18 $
|
||||
*/
|
||||
public class L2WarehouseItem
|
||||
{
|
||||
private final L2Item _item;
|
||||
private final int _object;
|
||||
private final long _count;
|
||||
private final int _owner;
|
||||
private final int _locationSlot;
|
||||
private final int _enchant;
|
||||
private final int _grade;
|
||||
private boolean _isAugmented;
|
||||
private int _augmentationId;
|
||||
private final int _customType1;
|
||||
private final int _customType2;
|
||||
private final int _mana;
|
||||
|
||||
private int _elemAtkType = -2;
|
||||
private int _elemAtkPower = 0;
|
||||
private final int[] _elemDefAttr =
|
||||
{
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
};
|
||||
private final int _time;
|
||||
|
||||
public L2WarehouseItem(L2ItemInstance item)
|
||||
{
|
||||
_item = item.getItem();
|
||||
_object = item.getObjectId();
|
||||
_count = item.getCount();
|
||||
_owner = item.getOwnerId();
|
||||
_locationSlot = item.getLocationSlot();
|
||||
_enchant = item.getEnchantLevel();
|
||||
_customType1 = item.getCustomType1();
|
||||
_customType2 = item.getCustomType2();
|
||||
_grade = item.getItem().getItemGrade();
|
||||
if (item.isAugmented())
|
||||
{
|
||||
_isAugmented = true;
|
||||
_augmentationId = item.getAugmentation().getAugmentationId();
|
||||
}
|
||||
else
|
||||
{
|
||||
_isAugmented = false;
|
||||
}
|
||||
_mana = item.getMana();
|
||||
_time = item.isTimeLimitedItem() ? (int) (item.getRemainingTime() / 1000) : -1;
|
||||
|
||||
_elemAtkType = item.getAttackElementType();
|
||||
_elemAtkPower = item.getAttackElementPower();
|
||||
for (byte i = 0; i < 6; i++)
|
||||
{
|
||||
_elemDefAttr[i] = item.getElementDefAttr(i);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the item.
|
||||
* @return L2Item
|
||||
*/
|
||||
public L2Item getItem()
|
||||
{
|
||||
return _item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the unique objectId
|
||||
* @return int
|
||||
*/
|
||||
public final int getObjectId()
|
||||
{
|
||||
return _object;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the owner
|
||||
* @return int
|
||||
*/
|
||||
public final int getOwnerId()
|
||||
{
|
||||
return _owner;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the LocationSlot
|
||||
* @return int
|
||||
*/
|
||||
public final int getLocationSlot()
|
||||
{
|
||||
return _locationSlot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the count
|
||||
* @return int
|
||||
*/
|
||||
public final long getCount()
|
||||
{
|
||||
return _count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the first type
|
||||
* @return int
|
||||
*/
|
||||
public final int getType1()
|
||||
{
|
||||
return _item.getType1();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the second type
|
||||
* @return int
|
||||
*/
|
||||
public final int getType2()
|
||||
{
|
||||
return _item.getType2();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the second type
|
||||
* @return int
|
||||
*/
|
||||
public final L2ItemType getItemType()
|
||||
{
|
||||
return _item.getItemType();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ItemId
|
||||
* @return int
|
||||
*/
|
||||
public final int getItemId()
|
||||
{
|
||||
return _item.getItemId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the part of body used with this item
|
||||
* @return int
|
||||
*/
|
||||
public final int getBodyPart()
|
||||
{
|
||||
return _item.getBodyPart();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the enchant level
|
||||
* @return int
|
||||
*/
|
||||
public final int getEnchantLevel()
|
||||
{
|
||||
return _enchant;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the item grade
|
||||
* @return int
|
||||
*/
|
||||
public final int getItemGrade()
|
||||
{
|
||||
return _grade;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if it is a weapon
|
||||
* @return boolean
|
||||
*/
|
||||
public final boolean isWeapon()
|
||||
{
|
||||
return (_item instanceof L2Weapon);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if it is an armor
|
||||
* @return boolean
|
||||
*/
|
||||
public final boolean isArmor()
|
||||
{
|
||||
return (_item instanceof L2Armor);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if it is an EtcItem
|
||||
* @return boolean
|
||||
*/
|
||||
public final boolean isEtcItem()
|
||||
{
|
||||
return (_item instanceof L2EtcItem);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the item
|
||||
* @return String
|
||||
*/
|
||||
public String getItemName()
|
||||
{
|
||||
return _item.getName();
|
||||
}
|
||||
|
||||
public boolean isAugmented()
|
||||
{
|
||||
return _isAugmented;
|
||||
}
|
||||
|
||||
public int getAugmentationId()
|
||||
{
|
||||
return _augmentationId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the item
|
||||
* @return String
|
||||
* @deprecated beware to use getItemName() instead because getName() is final in L2Object and could not be overridden! Allover L2Object.getName() may return null!
|
||||
*/
|
||||
@Deprecated
|
||||
public String getName()
|
||||
{
|
||||
return _item.getName();
|
||||
}
|
||||
|
||||
public final int getCustomType1()
|
||||
{
|
||||
return _customType1;
|
||||
}
|
||||
|
||||
public final int getCustomType2()
|
||||
{
|
||||
return _customType2;
|
||||
}
|
||||
|
||||
public final int getMana()
|
||||
{
|
||||
return _mana;
|
||||
}
|
||||
|
||||
public int getAttackElementType()
|
||||
{
|
||||
return _elemAtkType;
|
||||
}
|
||||
|
||||
public int getAttackElementPower()
|
||||
{
|
||||
return _elemAtkPower;
|
||||
}
|
||||
|
||||
public int getElementDefAttr(byte i)
|
||||
{
|
||||
return _elemDefAttr[i];
|
||||
}
|
||||
|
||||
public int getTime()
|
||||
{
|
||||
return _time;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the item
|
||||
* @return String
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return _item.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,453 @@
|
||||
/*
|
||||
* 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 com.l2jserver.gameserver.templates.item;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import javolution.util.FastList;
|
||||
|
||||
import com.l2jserver.gameserver.handler.ISkillHandler;
|
||||
import com.l2jserver.gameserver.handler.SkillHandler;
|
||||
import com.l2jserver.gameserver.model.L2Effect;
|
||||
import com.l2jserver.gameserver.model.L2ItemInstance;
|
||||
import com.l2jserver.gameserver.model.L2Object;
|
||||
import com.l2jserver.gameserver.model.L2Skill;
|
||||
import com.l2jserver.gameserver.model.actor.L2Character;
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.model.quest.Quest;
|
||||
import com.l2jserver.gameserver.skills.Env;
|
||||
import com.l2jserver.gameserver.skills.Formulas;
|
||||
import com.l2jserver.gameserver.skills.SkillHolder;
|
||||
import com.l2jserver.gameserver.skills.conditions.Condition;
|
||||
import com.l2jserver.gameserver.skills.conditions.ConditionGameChance;
|
||||
import com.l2jserver.gameserver.skills.funcs.Func;
|
||||
import com.l2jserver.gameserver.skills.funcs.FuncTemplate;
|
||||
import com.l2jserver.gameserver.templates.StatsSet;
|
||||
import com.l2jserver.gameserver.templates.skills.L2SkillType;
|
||||
import com.l2jserver.util.StringUtil;
|
||||
|
||||
/**
|
||||
* This class is dedicated to the management of weapons.
|
||||
* @version $Revision: 1.4.2.3.2.5 $ $Date: 2005/04/02 15:57:51 $
|
||||
*/
|
||||
public final class L2Weapon extends L2Item
|
||||
{
|
||||
private final L2WeaponType _type;
|
||||
private final boolean _isMagicWeapon;
|
||||
private final int _rndDam;
|
||||
private final int _soulShotCount;
|
||||
private final int _spiritShotCount;
|
||||
private final int _mpConsume;
|
||||
private SkillHolder _enchant4Skill = null; // skill that activates when item is enchanted +4 (for duals)
|
||||
private final int _changeWeaponId;
|
||||
// private final String[] _skill;
|
||||
|
||||
// Attached skills for Special Abilities
|
||||
private SkillHolder _skillsOnCast;
|
||||
private Condition _skillsOnCastCondition = null;
|
||||
private SkillHolder _skillsOnCrit;
|
||||
private Condition _skillsOnCritCondition = null;
|
||||
|
||||
private final int _reuseDelay;
|
||||
|
||||
/**
|
||||
* Constructor for Weapon.<BR>
|
||||
* <BR>
|
||||
* <U><I>Variables filled :</I></U><BR>
|
||||
* <LI>_soulShotCount & _spiritShotCount</LI> <LI>_pDam & _mDam & _rndDam</LI> <LI>_critical</LI> <LI>_hitModifier</LI> <LI>_avoidModifier</LI> <LI>_shieldDes & _shieldDefRate</LI> <LI>_atkSpeed & _AtkReuse</LI> <LI>_mpConsume</LI>
|
||||
* @param type : L2ArmorType designating the type of armor
|
||||
* @param set : StatsSet designating the set of couples (key,value) caracterizing the armor
|
||||
* @see L2Item constructor
|
||||
*/
|
||||
public L2Weapon(StatsSet set)
|
||||
{
|
||||
super(set);
|
||||
_type = L2WeaponType.valueOf(set.getString("weapon_type", "none").toUpperCase());
|
||||
_type1 = L2Item.TYPE1_WEAPON_RING_EARRING_NECKLACE;
|
||||
_type2 = L2Item.TYPE2_WEAPON;
|
||||
_isMagicWeapon = set.getBool("is_magic_weapon", false);
|
||||
_soulShotCount = set.getInteger("soulshots", 0);
|
||||
_spiritShotCount = set.getInteger("spiritshots", 0);
|
||||
_rndDam = set.getInteger("random_damage", 0);
|
||||
_mpConsume = set.getInteger("mp_consume", 0);
|
||||
_reuseDelay = set.getInteger("reuse_delay", 0);
|
||||
|
||||
String skill = set.getString("enchant4_skill", null);
|
||||
if (skill != null)
|
||||
{
|
||||
String[] info = skill.split("-");
|
||||
|
||||
if ((info != null) && (info.length == 2))
|
||||
{
|
||||
int id = 0;
|
||||
int level = 0;
|
||||
try
|
||||
{
|
||||
id = Integer.parseInt(info[0]);
|
||||
level = Integer.parseInt(info[1]);
|
||||
}
|
||||
catch (Exception nfe)
|
||||
{
|
||||
// Incorrect syntax, dont add new skill
|
||||
_log.info(StringUtil.concat("> Couldnt parse ", skill, " in weapon enchant skills! item ", toString()));
|
||||
}
|
||||
if ((id > 0) && (level > 0))
|
||||
{
|
||||
_enchant4Skill = new SkillHolder(id, level);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
skill = set.getString("oncast_skill", null);
|
||||
if (skill != null)
|
||||
{
|
||||
String[] info = skill.split("-");
|
||||
String infochance = set.getString("oncast_chance", null);
|
||||
if ((info != null) && (info.length == 2))
|
||||
{
|
||||
int id = 0;
|
||||
int level = 0;
|
||||
int chance = 0;
|
||||
try
|
||||
{
|
||||
id = Integer.parseInt(info[0]);
|
||||
level = Integer.parseInt(info[1]);
|
||||
if (infochance != null)
|
||||
{
|
||||
chance = Integer.parseInt(infochance);
|
||||
}
|
||||
}
|
||||
catch (Exception nfe)
|
||||
{
|
||||
// Incorrect syntax, dont add new skill
|
||||
_log.info(StringUtil.concat("> Couldnt parse ", skill, " in weapon oncast skills! item ", toString()));
|
||||
}
|
||||
if ((id > 0) && (level > 0) && (chance > 0))
|
||||
{
|
||||
_skillsOnCast = new SkillHolder(id, level);
|
||||
if (infochance != null)
|
||||
{
|
||||
_skillsOnCastCondition = new ConditionGameChance(chance);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
skill = set.getString("oncrit_skill", null);
|
||||
if (skill != null)
|
||||
{
|
||||
String[] info = skill.split("-");
|
||||
String infochance = set.getString("oncrit_chance", null);
|
||||
if ((info != null) && (info.length == 2))
|
||||
{
|
||||
int id = 0;
|
||||
int level = 0;
|
||||
int chance = 0;
|
||||
try
|
||||
{
|
||||
id = Integer.parseInt(info[0]);
|
||||
level = Integer.parseInt(info[1]);
|
||||
if (infochance != null)
|
||||
{
|
||||
chance = Integer.parseInt(infochance);
|
||||
}
|
||||
}
|
||||
catch (Exception nfe)
|
||||
{
|
||||
// Incorrect syntax, dont add new skill
|
||||
_log.info(StringUtil.concat("> Couldnt parse ", skill, " in weapon oncrit skills! item ", toString()));
|
||||
}
|
||||
if ((id > 0) && (level > 0) && (chance > 0))
|
||||
{
|
||||
_skillsOnCrit = new SkillHolder(id, level);
|
||||
if (infochance != null)
|
||||
{
|
||||
_skillsOnCritCondition = new ConditionGameChance(chance);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_changeWeaponId = set.getInteger("change_weaponId", 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of Weapon
|
||||
* @return L2WeaponType
|
||||
*/
|
||||
@Override
|
||||
public L2WeaponType getItemType()
|
||||
{
|
||||
return _type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ID of the Etc item after applying the mask.
|
||||
* @return int : ID of the Weapon
|
||||
*/
|
||||
@Override
|
||||
public int getItemMask()
|
||||
{
|
||||
return getItemType().mask();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if L2Weapon is magic type.
|
||||
* @return boolean
|
||||
*/
|
||||
public boolean isMagicWeapon()
|
||||
{
|
||||
return _isMagicWeapon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the quantity of SoulShot used.
|
||||
* @return int
|
||||
*/
|
||||
public int getSoulShotCount()
|
||||
{
|
||||
return _soulShotCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the quatity of SpiritShot used.
|
||||
* @return int
|
||||
*/
|
||||
public int getSpiritShotCount()
|
||||
{
|
||||
return _spiritShotCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the random damage inflicted by the weapon
|
||||
* @return int
|
||||
*/
|
||||
public int getRandomDamage()
|
||||
{
|
||||
return _rndDam;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the Reuse Delay of the L2Weapon.<BR>
|
||||
* <BR>
|
||||
* @return int
|
||||
*/
|
||||
public int getReuseDelay()
|
||||
{
|
||||
return _reuseDelay;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the MP consumption with the weapon
|
||||
* @return int
|
||||
*/
|
||||
public int getMpConsume()
|
||||
{
|
||||
return _mpConsume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns skill that player get when has equiped weapon +4 or more (for duals SA)
|
||||
* @return
|
||||
*/
|
||||
public L2Skill getEnchant4Skill()
|
||||
{
|
||||
if (_enchant4Skill == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return _enchant4Skill.getSkill();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Id in wich weapon this weapon can be changed
|
||||
* @return
|
||||
*/
|
||||
public int getChangeWeaponId()
|
||||
{
|
||||
return _changeWeaponId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns array of Func objects containing the list of functions used by the weapon
|
||||
* @param instance : L2ItemInstance pointing out the weapon
|
||||
* @param player : L2Character pointing out the player
|
||||
* @return Func[] : array of functions
|
||||
*/
|
||||
@Override
|
||||
public Func[] getStatFuncs(L2ItemInstance instance, L2Character player)
|
||||
{
|
||||
if ((_funcTemplates == null) || (_funcTemplates.length == 0))
|
||||
{
|
||||
return _emptyFunctionSet;
|
||||
}
|
||||
|
||||
ArrayList<Func> funcs = new ArrayList<>(_funcTemplates.length);
|
||||
|
||||
Env env = new Env();
|
||||
env.player = player;
|
||||
env.item = instance;
|
||||
Func f;
|
||||
|
||||
for (FuncTemplate t : _funcTemplates)
|
||||
{
|
||||
f = t.getFunc(env, instance);
|
||||
if (f != null)
|
||||
{
|
||||
funcs.add(f);
|
||||
}
|
||||
}
|
||||
|
||||
return funcs.toArray(new Func[funcs.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns effects of skills associated with the item to be triggered onHit.
|
||||
* @param caster : L2Character pointing out the caster
|
||||
* @param target : L2Character pointing out the target
|
||||
* @param crit : boolean tells whether the hit was critical
|
||||
* @return L2Effect[] : array of effects generated by the skill
|
||||
*/
|
||||
public L2Effect[] getSkillEffects(L2Character caster, L2Character target, boolean crit)
|
||||
{
|
||||
if ((_skillsOnCrit == null) || !crit)
|
||||
{
|
||||
return _emptyEffectSet;
|
||||
}
|
||||
List<L2Effect> effects = new FastList<>();
|
||||
|
||||
if (_skillsOnCritCondition != null)
|
||||
{
|
||||
Env env = new Env();
|
||||
env.player = caster;
|
||||
env.target = target;
|
||||
env.skill = _skillsOnCrit.getSkill();
|
||||
if (!_skillsOnCritCondition.test(env))
|
||||
{
|
||||
return _emptyEffectSet; // Skill condition not met
|
||||
}
|
||||
}
|
||||
|
||||
byte shld = Formulas.calcShldUse(caster, target, _skillsOnCrit.getSkill());
|
||||
if (!Formulas.calcSkillSuccess(caster, target, _skillsOnCrit.getSkill(), shld, false, false, false))
|
||||
{
|
||||
return _emptyEffectSet; // These skills should not work on RaidBoss
|
||||
}
|
||||
if (target.getFirstEffect(_skillsOnCrit.getSkill().getId()) != null)
|
||||
{
|
||||
target.getFirstEffect(_skillsOnCrit.getSkill().getId()).exit();
|
||||
}
|
||||
for (L2Effect e : _skillsOnCrit.getSkill().getEffects(caster, target, new Env(shld, false, false, false)))
|
||||
{
|
||||
effects.add(e);
|
||||
}
|
||||
if (effects.isEmpty())
|
||||
{
|
||||
return _emptyEffectSet;
|
||||
}
|
||||
return effects.toArray(new L2Effect[effects.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns effects of skills associated with the item to be triggered onCast.
|
||||
* @param caster : L2Character pointing out the caster
|
||||
* @param target : L2Character pointing out the target
|
||||
* @param trigger : L2Skill pointing out the skill triggering this action
|
||||
* @return L2Effect[] : array of effects generated by the skill
|
||||
*/
|
||||
public L2Effect[] getSkillEffects(L2Character caster, L2Character target, L2Skill trigger)
|
||||
{
|
||||
if (_skillsOnCast == null)
|
||||
{
|
||||
return _emptyEffectSet;
|
||||
}
|
||||
if (trigger.isOffensive() != _skillsOnCast.getSkill().isOffensive())
|
||||
{
|
||||
return _emptyEffectSet; // Trigger only same type of skill
|
||||
}
|
||||
if (trigger.isToggle() && (_skillsOnCast.getSkill().getSkillType() == L2SkillType.BUFF))
|
||||
{
|
||||
return _emptyEffectSet; // No buffing with toggle skills
|
||||
}
|
||||
if (!trigger.isMagic() && (_skillsOnCast.getSkill().getSkillType() == L2SkillType.BUFF))
|
||||
{
|
||||
return _emptyEffectSet; // No buffing with not magic skills
|
||||
}
|
||||
|
||||
if (_skillsOnCastCondition != null)
|
||||
{
|
||||
Env env = new Env();
|
||||
env.player = caster;
|
||||
env.target = target;
|
||||
env.skill = _skillsOnCast.getSkill();
|
||||
if (!_skillsOnCastCondition.test(env))
|
||||
{
|
||||
return _emptyEffectSet;
|
||||
}
|
||||
}
|
||||
|
||||
byte shld = Formulas.calcShldUse(caster, target, _skillsOnCast.getSkill());
|
||||
if (_skillsOnCast.getSkill().isOffensive() && !Formulas.calcSkillSuccess(caster, target, _skillsOnCast.getSkill(), shld, false, false, false))
|
||||
{
|
||||
return _emptyEffectSet;
|
||||
}
|
||||
|
||||
// Get the skill handler corresponding to the skill type
|
||||
ISkillHandler handler = SkillHandler.getInstance().getSkillHandler(_skillsOnCast.getSkill().getSkillType());
|
||||
|
||||
L2Character[] targets = new L2Character[1];
|
||||
targets[0] = target;
|
||||
|
||||
// Launch the magic skill and calculate its effects
|
||||
if (handler != null)
|
||||
{
|
||||
handler.useSkill(caster, _skillsOnCast.getSkill(), targets);
|
||||
}
|
||||
else
|
||||
{
|
||||
_skillsOnCast.getSkill().useSkill(caster, targets);
|
||||
}
|
||||
|
||||
// notify quests of a skill use
|
||||
if (caster instanceof L2PcInstance)
|
||||
{
|
||||
// Mobs in range 1000 see spell
|
||||
Collection<L2Object> objs = caster.getKnownList().getKnownObjects().values();
|
||||
// synchronized (caster.getKnownList().getKnownObjects())
|
||||
{
|
||||
for (L2Object spMob : objs)
|
||||
{
|
||||
if (spMob instanceof L2Npc)
|
||||
{
|
||||
L2Npc npcMob = (L2Npc) spMob;
|
||||
|
||||
if (npcMob.getTemplate().getEventQuests(Quest.QuestEventType.ON_SKILL_SEE) != null)
|
||||
{
|
||||
for (Quest quest : npcMob.getTemplate().getEventQuests(Quest.QuestEventType.ON_SKILL_SEE))
|
||||
{
|
||||
quest.notifySkillSee(npcMob, (L2PcInstance) caster, _skillsOnCast.getSkill(), targets, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return _emptyEffectSet;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* 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 com.l2jserver.gameserver.templates.item;
|
||||
|
||||
/**
|
||||
* @author mkizub <BR>
|
||||
* Description of Weapon Type
|
||||
*/
|
||||
public enum L2WeaponType implements L2ItemType
|
||||
{
|
||||
SWORD("Sword"),
|
||||
BLUNT("Blunt"),
|
||||
DAGGER("Dagger"),
|
||||
BOW("Bow"),
|
||||
POLE("Pole"),
|
||||
NONE("None"),
|
||||
DUAL("Dual Sword"),
|
||||
ETC("Etc"),
|
||||
FIST("Fist"),
|
||||
DUALFIST("Dual Fist"),
|
||||
FISHINGROD("Rod"),
|
||||
RAPIER("Rapier"),
|
||||
ANCIENTSWORD("Ancient"),
|
||||
CROSSBOW("Crossbow"),
|
||||
FLAG("Flag"),
|
||||
OWNTHING("Ownthing"),
|
||||
DUALDAGGER("Dual Dagger"),
|
||||
|
||||
// L2J CUSTOM, BACKWARD COMPATIBILITY
|
||||
BIGBLUNT("Big Blunt"),
|
||||
BIGSWORD("Big Sword");
|
||||
|
||||
private final int _mask;
|
||||
private final String _name;
|
||||
|
||||
/**
|
||||
* Constructor of the L2WeaponType.
|
||||
* @param id : int designating the ID of the WeaponType
|
||||
* @param name : String designating the name of the WeaponType
|
||||
*/
|
||||
private L2WeaponType(String name)
|
||||
{
|
||||
_mask = 1 << ordinal();
|
||||
_name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ID of the item after applying the mask.
|
||||
* @return int : ID of the item
|
||||
*/
|
||||
@Override
|
||||
public int mask()
|
||||
{
|
||||
return _mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the WeaponType
|
||||
* @return String
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user