Fix for minimum enchant value not used and support for blessed down by one enchant.

Contributed by CostyKiller.
This commit is contained in:
MobiusDevelopment
2020-11-18 09:14:09 +00:00
parent ed61cf165b
commit a99a9449f8
68 changed files with 663 additions and 102 deletions

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -318,12 +318,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -318,12 +318,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -318,12 +318,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -318,12 +318,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -318,12 +318,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -318,12 +318,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -320,12 +320,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -320,12 +320,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -320,12 +320,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -318,12 +318,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -318,12 +318,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -318,12 +318,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -318,12 +318,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -320,12 +320,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -320,12 +320,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -319,12 +319,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)

View File

@@ -39,6 +39,7 @@ public abstract class AbstractEnchantItem
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM,
EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP, EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP,
EtcItemType.BLESS_ENCHT_AM, EtcItemType.BLESS_ENCHT_AM,
EtcItemType.BLESS_ENCHT_AM_DOWN,
EtcItemType.BLESS_ENCHT_WP, EtcItemType.BLESS_ENCHT_WP,
EtcItemType.ENCHT_AM, EtcItemType.ENCHT_AM,
EtcItemType.ENCHT_WP, EtcItemType.ENCHT_WP,
@@ -56,6 +57,7 @@ public abstract class AbstractEnchantItem
private final int _id; private final int _id;
private final CrystalType _grade; private final CrystalType _grade;
private final int _minEnchantLevel;
private final int _maxEnchantLevel; private final int _maxEnchantLevel;
private final double _bonusRate; private final double _bonusRate;
@@ -71,6 +73,7 @@ public abstract class AbstractEnchantItem
throw new IllegalAccessError(); throw new IllegalAccessError();
} }
_grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE); _grade = set.getEnum("targetGrade", CrystalType.class, CrystalType.NONE);
_minEnchantLevel = set.getInt("maxEnchant", 0);
_maxEnchantLevel = set.getInt("maxEnchant", 127); _maxEnchantLevel = set.getInt("maxEnchant", 127);
_bonusRate = set.getDouble("bonusRate", 0); _bonusRate = set.getDouble("bonusRate", 0);
} }
@@ -112,6 +115,14 @@ public abstract class AbstractEnchantItem
*/ */
public abstract boolean isWeapon(); public abstract boolean isWeapon();
/**
* @return the minimum enchant level that this scroll/item can be used with
*/
public int getMinEnchantLevel()
{
return _minEnchantLevel;
}
/** /**
* @return the maximum enchant level that this scroll/item can be used with * @return the maximum enchant level that this scroll/item can be used with
*/ */
@@ -139,7 +150,7 @@ public abstract class AbstractEnchantItem
{ {
return false; return false;
} }
else if ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)) else if (((_minEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() < _minEnchantLevel)) && ((_maxEnchantLevel != 0) && (itemToEnchant.getEnchantLevel() >= _maxEnchantLevel)))
{ {
return false; return false;
} }

View File

@@ -35,6 +35,7 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
private final boolean _isWeapon; private final boolean _isWeapon;
private final boolean _isBlessed; private final boolean _isBlessed;
private final boolean _isBlessedDown;
private final boolean _isSafe; private final boolean _isSafe;
private final boolean _isGiant; private final boolean _isGiant;
private final int _scrollGroupId; private final int _scrollGroupId;
@@ -48,6 +49,7 @@ public class EnchantScroll extends AbstractEnchantItem
final ItemType type = getItem().getItemType(); final ItemType type = getItem().getItemType();
_isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP); _isWeapon = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.ENCHT_WP) || (type == EtcItemType.GIANT_ENCHT_WP);
_isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP); _isBlessed = (type == EtcItemType.BLESS_ENCHT_AM) || (type == EtcItemType.BLESS_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_WP) || (type == EtcItemType.BLESSED_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_AM) || (type == EtcItemType.BLESSED_GIANT_ENCHT_ATTR_INC_PROP_ENCHT_WP);
_isBlessedDown = (type == EtcItemType.BLESS_ENCHT_AM_DOWN);
_isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP); _isSafe = (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_ANCIENT_CRYSTAL_ENCHANT_WP) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_AM) || (type == EtcItemType.ENCHT_ATTR_CRYSTAL_ENCHANT_WP);
_isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP); _isGiant = (type == EtcItemType.GIANT_ENCHT_AM) || (type == EtcItemType.GIANT_ENCHT_WP);
} }
@@ -59,13 +61,21 @@ public class EnchantScroll extends AbstractEnchantItem
} }
/** /**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure), {@code false} otherwise * @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will reset to 0), {@code false} otherwise
*/ */
public boolean isBlessed() public boolean isBlessed()
{ {
return _isBlessed; return _isBlessed;
} }
/**
* @return {@code true} for blessed scrolls (enchanted item will remain on failure and enchant value will go down by 1), {@code false} otherwise
*/
public boolean isBlessedDown()
{
return _isBlessedDown;
}
/** /**
* @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise * @return {@code true} for safe-enchant scrolls (enchant level will remain on failure), {@code false} otherwise
*/ */
@@ -123,6 +133,10 @@ public class EnchantScroll extends AbstractEnchantItem
{ {
return false; return false;
} }
else if ((isBlessedDown() && !supportItem.isBlessed()) || (!isBlessedDown() && supportItem.isBlessed()))
{
return false;
}
else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant())) else if ((isGiant() && !supportItem.isGiant()) || (!isGiant() && supportItem.isGiant()))
{ {
return false; return false;

View File

@@ -46,6 +46,7 @@ public enum EtcItemType implements ItemType
GIANT_ENCHT_AM, GIANT_ENCHT_AM,
BLESS_ENCHT_WP, BLESS_ENCHT_WP,
BLESS_ENCHT_AM, BLESS_ENCHT_AM,
BLESS_ENCHT_AM_DOWN,
COUPON, COUPON,
ELIXIR, ELIXIR,
ENCHT_ATTR, ENCHT_ATTR,

View File

@@ -320,12 +320,19 @@ public class RequestEnchantItem implements IClientIncomingPacket
player.broadcastUserInfo(); player.broadcastUserInfo();
} }
if (scrollTemplate.isBlessed() || ((supportTemplate != null) && supportTemplate.isBlessed())) if (scrollTemplate.isBlessed() || scrollTemplate.isBlessedDown() || ((supportTemplate != null) && supportTemplate.isBlessed()))
{ {
// blessed enchant - enchant value down by 1
if (scrollTemplate.isBlessedDown())
{
item.setEnchantLevel(item.getEnchantLevel() - 1);
}
else
// blessed enchant - clear enchant value // blessed enchant - clear enchant value
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0); {
client.sendPacket(SystemMessageId.THE_BLESSED_ENCHANT_FAILED_THE_ENCHANT_VALUE_OF_THE_ITEM_BECAME_0);
item.setEnchantLevel(0); item.setEnchantLevel(0);
}
item.updateDatabase(); item.updateDatabase();
client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0)); client.sendPacket(new EnchantResult(EnchantResult.BLESSED_FAIL, 0, 0));
if (Config.LOG_ITEM_ENCHANTS) if (Config.LOG_ITEM_ENCHANTS)