Recipes rework.

Adapted from: L2jUnity free files.
This commit is contained in:
MobiusDev
2017-11-21 04:25:11 +00:00
parent 6ccc5c8938
commit 7e1b0b4009
67 changed files with 32555 additions and 19075 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -90,12 +90,16 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("CpHealOverTime", CpHealOverTime::new);
EffectHandler.getInstance().registerHandler("CpHealPercent", CpHealPercent::new);
EffectHandler.getInstance().registerHandler("CpRegen", CpRegen::new);
EffectHandler.getInstance().registerHandler("CraftingCritical", CraftingCritical::new);
EffectHandler.getInstance().registerHandler("CreateCommonItem", CreateCommonItem::new);
EffectHandler.getInstance().registerHandler("CreateItem", CreateItem::new);
EffectHandler.getInstance().registerHandler("CreateItemRandom", CreateItemRandom::new);
EffectHandler.getInstance().registerHandler("CriticalDamage", CriticalDamage::new);
EffectHandler.getInstance().registerHandler("CriticalDamagePosition", CriticalDamagePosition::new);
EffectHandler.getInstance().registerHandler("CriticalRate", CriticalRate::new);
EffectHandler.getInstance().registerHandler("CriticalRatePositionBonus", CriticalRatePositionBonus::new);
EffectHandler.getInstance().registerHandler("CrystalGradeModify", CrystalGradeModify::new);
EffectHandler.getInstance().registerHandler("Crystallize", Crystallize::new);
EffectHandler.getInstance().registerHandler("CubicMastery", CubicMastery::new);
EffectHandler.getInstance().registerHandler("DamageBlock", DamageBlock::new);
EffectHandler.getInstance().registerHandler("DamageShield", DamageShield::new);
@@ -265,6 +269,7 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("ReflectSkill", ReflectSkill::new);
EffectHandler.getInstance().registerHandler("RefuelAirship", RefuelAirship::new);
EffectHandler.getInstance().registerHandler("Relax", Relax::new);
EffectHandler.getInstance().registerHandler("RemoveEquipPenalty", RemoveEquipPenalty::new);
EffectHandler.getInstance().registerHandler("ResetInstanceEntry", ResetInstanceEntry::new);
EffectHandler.getInstance().registerHandler("ResistAbnormalByCategory", ResistAbnormalByCategory::new);
EffectHandler.getInstance().registerHandler("ResistDDMagic", ResistDDMagic::new);

View File

@@ -0,0 +1,31 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.effecthandlers;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.stats.Stats;
/**
* @author Nik
*/
public class CraftingCritical extends AbstractStatAddEffect
{
public CraftingCritical(StatsSet params)
{
super(params, Stats.CRAFTING_CRITICAL);
}
}

View File

@@ -0,0 +1,64 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.effecthandlers;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
import com.l2jmobius.gameserver.model.skills.BuffInfo;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
* An effect that allows the player to create common recipe items up to a certain level.
* @author Nik
*/
public final class CreateCommonItem extends AbstractEffect
{
private final int _recipeLevel;
public CreateCommonItem(StatsSet params)
{
_recipeLevel = params.getInt("value");
}
@Override
public boolean canStart(BuffInfo info)
{
return info.getEffected().isPlayer();
}
@Override
public void onStart(L2Character effector, L2Character effected, Skill skill)
{
final L2PcInstance player = effected.getActingPlayer();
if (player != null)
{
player.setCreateCommonItemLevel(_recipeLevel);
}
}
@Override
public void onExit(BuffInfo info)
{
final L2PcInstance player = info.getEffected().getActingPlayer();
if (player != null)
{
player.setCreateCommonItemLevel(0);
}
}
}

View File

@@ -0,0 +1,64 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.effecthandlers;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
import com.l2jmobius.gameserver.model.skills.BuffInfo;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
* An effect that allows the player to create dwarven recipe items up to a certain level.
* @author Nik
*/
public final class CreateItem extends AbstractEffect
{
private final int _recipeLevel;
public CreateItem(StatsSet params)
{
_recipeLevel = params.getInt("value");
}
@Override
public boolean canStart(BuffInfo info)
{
return info.getEffected().isPlayer();
}
@Override
public void onStart(L2Character effector, L2Character effected, Skill skill)
{
final L2PcInstance player = effected.getActingPlayer();
if (player != null)
{
player.setCreateItemLevel(_recipeLevel);
}
}
@Override
public void onExit(BuffInfo info)
{
final L2PcInstance player = info.getEffected().getActingPlayer();
if (player != null)
{
player.setCreateItemLevel(0);
}
}
}

View File

@@ -29,11 +29,11 @@ import com.l2jmobius.gameserver.model.skills.Skill;
*/
public final class CrystalGradeModify extends AbstractEffect
{
private final int _grade;
private final int _amount;
public CrystalGradeModify(StatsSet params)
{
_grade = params.getInt("grade", 0);
_amount = params.getInt("_amount", 0);
}
@Override
@@ -45,7 +45,7 @@ public final class CrystalGradeModify extends AbstractEffect
@Override
public void onStart(L2Character effector, L2Character effected, Skill skill)
{
effected.getActingPlayer().setExpertisePenaltyBonus(_grade);
effected.getActingPlayer().setExpertisePenaltyBonus(_amount);
}
@Override

View File

@@ -0,0 +1,65 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.effecthandlers;
import com.l2jmobius.gameserver.enums.ItemGrade;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
import com.l2jmobius.gameserver.model.skills.BuffInfo;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
* An effect that allows the player to crystallize items up to a certain grade.
* @author Nik
*/
public final class Crystallize extends AbstractEffect
{
private final ItemGrade _grade;
public Crystallize(StatsSet params)
{
_grade = params.getEnum("grade", ItemGrade.class);
}
@Override
public boolean canStart(BuffInfo info)
{
return info.getEffected().isPlayer();
}
@Override
public void onStart(L2Character effector, L2Character effected, Skill skill)
{
final L2PcInstance player = effected.getActingPlayer();
if (player != null)
{
player.setCrystallizeGrade(_grade);
}
}
@Override
public void onExit(BuffInfo info)
{
final L2PcInstance player = info.getEffected().getActingPlayer();
if (player != null)
{
player.setCrystallizeGrade(null);
}
}
}

View File

@@ -16,7 +16,6 @@
*/
package handlers.effecthandlers;
import com.l2jmobius.gameserver.RecipeController;
import com.l2jmobius.gameserver.enums.PrivateStoreType;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
@@ -25,6 +24,7 @@ import com.l2jmobius.gameserver.model.effects.AbstractEffect;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.SystemMessageId;
import com.l2jmobius.gameserver.network.serverpackets.RecipeBookItemList;
/**
* Open Common Recipe Book effect implementation.
@@ -45,18 +45,24 @@ public final class OpenCommonRecipeBook extends AbstractEffect
@Override
public void instant(L2Character effector, L2Character effected, Skill skill, L2ItemInstance item)
{
if (!effector.isPlayer())
final L2PcInstance casterPlayer = effector.getActingPlayer();
if (casterPlayer == null)
{
return;
}
final L2PcInstance player = effector.getActingPlayer();
if (player.getPrivateStoreType() != PrivateStoreType.NONE)
if (casterPlayer.getPrivateStoreType() == PrivateStoreType.MANUFACTURE)
{
player.sendPacket(SystemMessageId.ITEM_CREATION_IS_NOT_POSSIBLE_WHILE_ENGAGED_IN_A_TRADE);
casterPlayer.sendPacket(SystemMessageId.YOU_MAY_NOT_ALTER_YOUR_RECIPE_BOOK_WHILE_ENGAGED_IN_MANUFACTURING);
return;
}
RecipeController.getInstance().requestBookOpen(player, false);
if (casterPlayer.isProcessingTransaction())
{
casterPlayer.sendPacket(SystemMessageId.ITEM_CREATION_IS_NOT_POSSIBLE_WHILE_ENGAGED_IN_A_TRADE);
return;
}
casterPlayer.sendPacket(new RecipeBookItemList(casterPlayer, false));
}
}

View File

@@ -16,7 +16,6 @@
*/
package handlers.effecthandlers;
import com.l2jmobius.gameserver.RecipeController;
import com.l2jmobius.gameserver.enums.PrivateStoreType;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
@@ -25,6 +24,7 @@ import com.l2jmobius.gameserver.model.effects.AbstractEffect;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.SystemMessageId;
import com.l2jmobius.gameserver.network.serverpackets.RecipeBookItemList;
/**
* Open Dwarf Recipe Book effect implementation.
@@ -45,18 +45,24 @@ public final class OpenDwarfRecipeBook extends AbstractEffect
@Override
public void instant(L2Character effector, L2Character effected, Skill skill, L2ItemInstance item)
{
if (!effector.isPlayer())
final L2PcInstance casterPlayer = effector.getActingPlayer();
if (casterPlayer == null)
{
return;
}
final L2PcInstance player = effector.getActingPlayer();
if (player.getPrivateStoreType() != PrivateStoreType.NONE)
if (casterPlayer.getPrivateStoreType() == PrivateStoreType.MANUFACTURE)
{
player.sendPacket(SystemMessageId.ITEM_CREATION_IS_NOT_POSSIBLE_WHILE_ENGAGED_IN_A_TRADE);
casterPlayer.sendPacket(SystemMessageId.YOU_MAY_NOT_ALTER_YOUR_RECIPE_BOOK_WHILE_ENGAGED_IN_MANUFACTURING);
return;
}
RecipeController.getInstance().requestBookOpen(player, true);
if (casterPlayer.isProcessingTransaction())
{
casterPlayer.sendPacket(SystemMessageId.ITEM_CREATION_IS_NOT_POSSIBLE_WHILE_ENGAGED_IN_A_TRADE);
return;
}
casterPlayer.sendPacket(new RecipeBookItemList(casterPlayer, true));
}
}

View File

@@ -0,0 +1,65 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.effecthandlers;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
import com.l2jmobius.gameserver.model.items.type.CrystalType;
import com.l2jmobius.gameserver.model.skills.BuffInfo;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
* An effect that removes equipment grade penalty. Its the base effect for the grade penalty mechanics.
* @author Nik
*/
public final class RemoveEquipPenalty extends AbstractEffect
{
private final CrystalType _grade;
public RemoveEquipPenalty(StatsSet params)
{
_grade = params.getEnum("grade", CrystalType.class);
}
@Override
public boolean canStart(BuffInfo info)
{
return info.getEffected().isPlayer();
}
@Override
public void onStart(L2Character effector, L2Character effected, Skill skill)
{
final L2PcInstance player = effected.getActingPlayer();
if (player != null)
{
player.setExpertiseLevel(_grade);
}
}
@Override
public void onExit(BuffInfo info)
{
final L2PcInstance player = info.getEffected().getActingPlayer();
if (player != null)
{
player.setExpertiseLevel(null);
}
}
}

View File

@@ -42,7 +42,7 @@ public class CharmOfCourage implements IItemHandler
final L2PcInstance activeChar = playable.getActingPlayer();
int level = activeChar.getLevel();
final int itemLevel = item.getItem().getCrystalType().getId();
final int itemLevel = item.getItem().getCrystalType().getLevel();
if (level < 20)
{

View File

@@ -18,9 +18,9 @@ package handlers.itemhandlers;
import com.l2jmobius.gameserver.data.xml.impl.RecipeData;
import com.l2jmobius.gameserver.handler.IItemHandler;
import com.l2jmobius.gameserver.model.L2RecipeList;
import com.l2jmobius.gameserver.model.actor.L2Playable;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.RecipeHolder;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.network.SystemMessageId;
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -40,15 +40,16 @@ public class Recipes implements IItemHandler
}
final L2PcInstance activeChar = playable.getActingPlayer();
if (activeChar.isInCraftMode())
if (activeChar.isCrafting())
{
activeChar.sendPacket(SystemMessageId.YOU_MAY_NOT_ALTER_YOUR_RECIPE_BOOK_WHILE_ENGAGED_IN_MANUFACTURING);
return false;
}
final L2RecipeList rp = RecipeData.getInstance().getRecipeByItemId(item.getId());
final RecipeHolder rp = RecipeData.getInstance().getRecipeByRecipeItemId(item.getId());
if (rp == null)
{
activeChar.sendPacket(SystemMessageId.THE_RECIPE_IS_INCORRECT);
return false;
}
@@ -63,15 +64,15 @@ public class Recipes implements IItemHandler
boolean recipeLimit = false;
if (rp.isDwarvenRecipe())
{
canCraft = activeChar.hasDwarvenCraft();
recipeLevel = (rp.getLevel() > activeChar.getDwarvenCraft());
recipeLimit = (activeChar.getDwarvenRecipeBook().length >= activeChar.getDwarfRecipeLimit());
canCraft = activeChar.getCreateItemLevel() > 0;
recipeLevel = (rp.getLevel() > activeChar.getCreateItemLevel());
recipeLimit = (activeChar.getDwarvenRecipeBook().size() >= activeChar.getDwarfRecipeLimit());
}
else
{
canCraft = activeChar.hasCommonCraft();
recipeLevel = (rp.getLevel() > activeChar.getCommonCraft());
recipeLimit = (activeChar.getCommonRecipeBook().length >= activeChar.getCommonRecipeLimit());
canCraft = activeChar.getCreateCommonItemLevel() > 0;
recipeLevel = (rp.getLevel() > activeChar.getCreateCommonItemLevel());
recipeLimit = (activeChar.getCommonRecipeBook().size() >= activeChar.getCommonRecipeLimit());
}
if (!canCraft)

View File

@@ -119,7 +119,7 @@ public final class SocialAction implements IPlayerActionHandler
}
SystemMessage sm;
if (player.isInStoreMode() || player.isInCraftMode())
if (player.isInStoreMode() || player.isCrafting())
{
sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_IN_PRIVATE_STORE_MODE_OR_IN_A_BATTLE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION);
sm.addPcName(player);
@@ -198,7 +198,7 @@ public final class SocialAction implements IPlayerActionHandler
// Checks for partner.
final L2PcInstance partner = target.getActingPlayer();
if (partner.isInStoreMode() || partner.isInCraftMode())
if (partner.isInStoreMode() || partner.isCrafting())
{
sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_IN_PRIVATE_STORE_MODE_OR_IN_A_BATTLE_AND_CANNOT_BE_REQUESTED_FOR_A_COUPLE_ACTION);
sm.addPcName(partner);

View File

@@ -2727,6 +2727,27 @@
</magicLvl>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="CreateItem">
<value>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
<value level="4">4</value>
<value level="5">5</value>
<value level="6">6</value>
<value level="7">7</value>
<value level="8">8</value>
<value level="9">9</value>
<value level="10">10</value>
<value level="11">11</value>
<value level="12">12</value>
<value level="13">13</value>
<value level="14">14</value>
<value level="15">15</value>
</value>
</effect>
</effects>
</skill>
<skill id="173" toLevel="2" name="Acrobatics">
<!-- Confirmed CT2.5 -->

View File

@@ -2434,6 +2434,22 @@
</magicLvl>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="RemoveEquipPenalty">
<grade>
<value level="1">D</value>
<value level="2">C</value>
<value level="3">B</value>
<value level="4">A</value>
<value level="5">S</value>
<value level="6">S80</value>
<value level="7">S80</value>
<value level="8">R</value>
<value level="9">R95</value>
<value level="10">R99</value>
</grade>
</effect>
</effects>
</skill>
<skill id="244" toLevel="3" name="Armor Mastery">
<!-- Confirmed CT2.5 -->
@@ -2615,6 +2631,18 @@
</magicLvl>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="Crystallize">
<grade>
<value level="1">D</value>
<value level="2">C</value>
<value level="3">B</value>
<value level="4">A</value>
<value level="5">S</value>
<value level="6">R</value>
</grade>
</effect>
</effects>
</skill>
<skill id="249" toLevel="42" name="Weapon Mastery">
<!-- Confirmed CT2.5 -->

View File

@@ -666,6 +666,22 @@
</magicLvl>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="CreateCommonItem">
<value>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
<value level="4">4</value>
<value level="5">5</value>
<value level="6">6</value>
<value level="7">7</value>
<value level="8">8</value>
<value level="9">9</value>
<value level="10">10</value>
</value>
</effect>
</effects>
</skill>
<skill id="1321" toLevel="1" name="Dwarven Craft">
<!-- Confirmed CT2.5 -->

View File

@@ -509,10 +509,25 @@
</effects>
</skill>
<skill id="10312" toLevel="4" name="Crafting Mastery">
<!-- AUTO GENERATED SKILL -->
<!-- There is a small chance that the item quantity will double upon crafting. Critical level 1. -->
<icon>icon.skill10312</icon>
<magicLvl>
<value level="1">85</value>
<value level="2">90</value>
<value level="3">95</value>
<value level="4">99</value>
</magicLvl>
<operateType>P</operateType>
<effects>
<effect name="CraftingCritical">
<amount>
<value level="1">2.4</value>
<value level="2">3.8</value>
<value level="3">4.2</value>
<value level="4">5.4</value>
</amount>
</effect>
</effects>
</skill>
<skill id="10313" toLevel="4" name="Infinite Rush">
<!-- Rush toward the frontal enemies to inflict Shock for 9 sec. Requires a sword, blunt, spear, fist weapon, dual blunt, or dual sword. -->

View File

@@ -1268,10 +1268,10 @@
</passiveConditions>
<effects>
<effect name="CrystalGradeModify">
<grade>
<amount>
<value level="1">3</value>
<value level="2">5</value>
</grade>
</amount>
</effect>
</effects>
</skill>

View File

@@ -1320,13 +1320,13 @@
</passiveConditions>
<effects>
<effect name="CrystalGradeModify">
<grade>
<amount>
<value level="1">1</value>
<value level="2">2</value>
<value level="3">3</value>
<value level="4">4</value>
<value level="5">5</value>
</grade>
</amount>
</effect>
</effects>
</skill>

View File

@@ -59,12 +59,16 @@ CpHealOverTime: Increases current CP by a given amount over time.
CpHealPercent: Increases current CP by a given percentage amount.
Cp: Increases current CP by a static amount.
CpRegen: CP Regeneration stat.
CraftingCritical: Crafting critical stat.
CreateCommonItem: Allows the player to create common recipe items up to a certain level.
CreateItem: Allows the player to create dwarven recipe items up to a certain level.
CreateItemRandom: Creates an item randomly from a given list. All extractable items with chances to get different items are using this effect.
CriticalDamage: Critical Damage stat.
CriticalDamagePosition: Critical Damage depending on position stat.
CriticalRate: Critical Rate stat.
CriticalRatePositionBonus: Critical Rate depending on position stat. Ignores the critical rate cap of 500.
CrystalGradeModify: Sets your Expertise Grade level. With this effect you can make lv. 40 player (C Grade) to wear S grade.
Crystallize: Allows the player to crystallize items up to a certain grade.
CubicMastery: Max cubics stat.
DamageBlock: Blocks Hp or Mp damage/heal.
DamageShield: Reflect damage percentage stat.
@@ -233,6 +237,7 @@ ReflectMagic: Deflects magical damage back to the attacker.
ReflectSkill: Deflects physical/magical debuffs back to the attacker.
RefuelAirship: Increases Airship's fuel.
Relax: Sits down and increases HP regeneration until full.
RemoveEquipPenalty: Removes equipment grade penalty. Its the base effect for the grade penalty mechanics.
ResetInstanceEntry: Resets instance re-entry time. (l2jmobius)
ResistAbnormalByCategory: Buff/debuff resist stat.
ResistDDMagic: Magic resist stat (magic attack 50% effective or 1 damage)

View File

@@ -2,88 +2,68 @@
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="item" minOccurs="1" maxOccurs="unbounded">
<xs:sequence>
<xs:element name="recipe" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="altStatChange" minOccurs="0" maxOccurs="1">
<xs:sequence>
<xs:element name="materials">
<xs:complexType>
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="GIM" />
<xs:enumeration value="SP" />
<xs:enumeration value="XP" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="value" type="xs:positiveInteger" use="required" />
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:attribute name="id" type="xs:int" />
<xs:attribute name="count" type="xs:long" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ingredient" minOccurs="1" maxOccurs="unbounded">
<xs:element name="product">
<xs:complexType>
<xs:attribute name="count" type="xs:positiveInteger" use="required" />
<xs:attribute name="id" type="xs:positiveInteger" use="required" />
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded" minOccurs="1">
<xs:complexType>
<xs:attribute name="id" type="xs:int" />
<xs:attribute name="count" type="xs:long" />
<xs:attribute name="chance" type="xs:double" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="production" minOccurs="1" maxOccurs="1">
<xs:element name="npcFee" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:attribute name="count" type="xs:positiveInteger" use="required" />
<xs:attribute name="id" type="xs:positiveInteger" use="required" />
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="id" type="xs:int" />
<xs:attribute name="count" type="xs:long" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="productionRare" minOccurs="0" maxOccurs="1">
<xs:element name="statUse">
<xs:complexType>
<xs:attribute name="count" type="xs:positiveInteger" use="required" />
<xs:attribute name="id" type="xs:positiveInteger" use="required" />
<xs:attribute name="rarity" type="xs:positiveInteger" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="statUse" minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:attribute name="name" use="required">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="HP" />
<xs:enumeration value="MP" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="value" type="xs:positiveInteger" use="required" />
<xs:sequence>
<xs:element name="stat">
<xs:complexType>
<xs:attribute name="name" type="xs:string"></xs:attribute>
<xs:attribute name="val" type="xs:double" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="craftLevel" use="required">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="1" />
<xs:maxInclusive value="14" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="id" type="xs:positiveInteger" use="required" />
<xs:attribute name="name" type="xs:normalizedString" use="required" />
<xs:attribute name="recipeId" type="xs:positiveInteger" use="required" />
<xs:attribute name="successRate" use="required">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:enumeration value="10" />
<xs:enumeration value="25" />
<xs:enumeration value="60" />
<xs:enumeration value="70" />
<xs:enumeration value="95" />
<xs:enumeration value="100" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="common" />
<xs:enumeration value="dwarven" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="id" type="xs:int" use="required" />
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="level" type="xs:int" use="required" />
<xs:attribute name="itemId" type="xs:int" use="required" />
<xs:attribute name="successRate" type="xs:double" use="required" />
<xs:attribute name="isCommonRecipe" type="xs:string" use="required" />
<xs:attribute name="maxOffering" type="xs:long" use="optional" />
<xs:attribute name="maxOfferingBonus" type="xs:double" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>

View File

@@ -1197,6 +1197,21 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="grade">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="side" type="xs:string" />
<xs:element name="PARALYZE">
<xs:complexType mixed="true">
@@ -2037,21 +2052,6 @@
<xs:element name="hp" type="xs:unsignedByte" />
<xs:element name="mp" type="xs:unsignedByte" />
<xs:element name="cp" type="xs:unsignedByte" />
<xs:element name="grade">
<xs:complexType mixed="true">
<xs:sequence minOccurs="0">
<xs:element maxOccurs="unbounded" name="value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:unsignedByte">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="xp" type="xs:unsignedInt" />
<xs:element name="ACCURACY_COMBAT">
<xs:complexType mixed="true">