Przeglądaj źródła

Missing CH on AuctionManager
Config for elemental enchant chance
Config for additional MP consume on dances/songs
RequestCrystalizeItem packet update (Add some missing messages and inventory update packet)
MagicSkillUse packet update (Add target location)
EffectDamOverTime effect update (Stop sleep when character effected with a DamOverTime effect (Sleep will not remove from a toggle skill))

Charus 15 lat temu
rodzic
commit
4f319cefff

+ 5 - 0
L2_GameServer/java/config/Character.properties

@@ -97,6 +97,10 @@ maxdanceamount = 12
 # Default: False 
 DanceCancelBuff = False
 
+# This option enables/disables additional MP consume for dances and songs.
+# Default: True
+DanceConsumeAdditionalMP = True
+
 # This option allows a player to automatically learn Divine Inspiration.
 # This is not included in AutoLearnSkills above.
 # Default: False
@@ -281,6 +285,7 @@ MaximumFreightSlots = 20
 EnchantChanceWeapon = 66
 EnchantChanceArmor = 66
 EnchantChanceJewelry = 66
+EnchantChanceElement = 50
 
 # DEFAULT NEEDS TO BE VERIFIED, MUST BE CHANGED HERE AND IN CONFIG.JAVA IF NOT CORRECT
 # Default: 66,66,66

+ 5 - 0
L2_GameServer/java/net/sf/l2j/Config.java

@@ -83,6 +83,7 @@ public final class Config
 	public static byte BUFFS_MAX_AMOUNT;
 	public static byte DANCES_MAX_AMOUNT;
 	public static boolean DANCE_CANCEL_BUFF;
+	public static boolean DANCE_CONSUME_ADDITIONAL_MP;
 	public static boolean AUTO_LEARN_DIVINE_INSPIRATION;
 	public static boolean ALT_GAME_CANCEL_BOW;
 	public static boolean ALT_GAME_CANCEL_CAST;
@@ -816,6 +817,7 @@ public final class Config
 	public static int ENCHANT_CHANCE_WEAPON;
 	public static int ENCHANT_CHANCE_ARMOR;
 	public static int ENCHANT_CHANCE_JEWELRY;
+	public static int ENCHANT_CHANCE_ELEMENT;
 	public static int BLESSED_ENCHANT_CHANCE_WEAPON;
 	public static int BLESSED_ENCHANT_CHANCE_ARMOR;
 	public static int BLESSED_ENCHANT_CHANCE_JEWELRY;
@@ -1202,6 +1204,7 @@ public final class Config
 					BUFFS_MAX_AMOUNT = Byte.parseByte(Character.getProperty("maxbuffamount","20"));
 					DANCES_MAX_AMOUNT = Byte.parseByte(Character.getProperty("maxdanceamount","12"));
 					DANCE_CANCEL_BUFF = Boolean.parseBoolean(Character.getProperty("DanceCancelBuff", "false"));
+					DANCE_CONSUME_ADDITIONAL_MP = Boolean.parseBoolean(Character.getProperty("DanceConsumeAdditionalMP", "true"));
 					AUTO_LEARN_DIVINE_INSPIRATION = Boolean.parseBoolean(Character.getProperty("AutoLearnDivineInspiration", "false"));
 					ALT_GAME_CANCEL_BOW = Character.getProperty("AltGameCancelByHit", "Cast").equalsIgnoreCase("bow") || Character.getProperty("AltGameCancelByHit", "Cast").equalsIgnoreCase("all");
 					ALT_GAME_CANCEL_CAST = Character.getProperty("AltGameCancelByHit", "Cast").equalsIgnoreCase("cast") || Character.getProperty("AltGameCancelByHit", "Cast").equalsIgnoreCase("all");
@@ -1247,6 +1250,7 @@ public final class Config
 					ENCHANT_CHANCE_WEAPON = Integer.parseInt(Character.getProperty("EnchantChanceWeapon", "66"));
 					ENCHANT_CHANCE_ARMOR = Integer.parseInt(Character.getProperty("EnchantChanceArmor", "66"));
 					ENCHANT_CHANCE_JEWELRY = Integer.parseInt(Character.getProperty("EnchantChanceJewelry", "66"));
+					ENCHANT_CHANCE_ELEMENT = Integer.parseInt(Character.getProperty("EnchantChanceElement", "50"));
 					BLESSED_ENCHANT_CHANCE_WEAPON = Integer.parseInt(Character.getProperty("BlessedEnchantChanceWeapon", "66"));
 					BLESSED_ENCHANT_CHANCE_ARMOR = Integer.parseInt(Character.getProperty("BlessedEnchantChanceArmor", "66"));
 					BLESSED_ENCHANT_CHANCE_JEWELRY = Integer.parseInt(Character.getProperty("BlessedEnchantChanceJewelry", "66"));
@@ -2289,6 +2293,7 @@ public final class Config
 		else if (pName.equalsIgnoreCase("EnchantChanceWeapon")) ENCHANT_CHANCE_WEAPON = Integer.parseInt(pValue);
 		else if (pName.equalsIgnoreCase("EnchantChanceArmor")) ENCHANT_CHANCE_ARMOR = Integer.parseInt(pValue);
 		else if (pName.equalsIgnoreCase("EnchantChanceJewelry")) ENCHANT_CHANCE_JEWELRY = Integer.parseInt(pValue);
+		else if (pName.equalsIgnoreCase("EnchantChanceElement")) ENCHANT_CHANCE_ELEMENT = Integer.parseInt(pValue);
 		else if (pName.equalsIgnoreCase("EnchantMaxWeapon")) ENCHANT_MAX_WEAPON = Integer.parseInt(pValue);
 		else if (pName.equalsIgnoreCase("EnchantMaxArmor")) ENCHANT_MAX_ARMOR = Integer.parseInt(pValue);
 		else if (pName.equalsIgnoreCase("EnchantMaxJewelry")) ENCHANT_MAX_JEWELRY = Integer.parseInt(pValue);

+ 46 - 41
L2_GameServer/java/net/sf/l2j/gameserver/instancemanager/AuctionManager.java

@@ -29,48 +29,53 @@ public class AuctionManager
 {
 	protected static final Logger _log = Logger.getLogger(AuctionManager.class.getName());
 	private List<Auction> _auctions;
-	private static final String[] ITEM_INIT_DATA = {
-			"(23, 0, 'NPC', 'NPC Clan', 'ClanHall', 23, 0, 'Onyx Hall', 1, 20000000, 0, 1164841200000)",
-			"(24, 0, 'NPC', 'NPC Clan', 'ClanHall', 24, 0, 'Topaz Hall', 1, 20000000, 0, 1164841200000)",
-			"(25, 0, 'NPC', 'NPC Clan', 'ClanHall', 25, 0, 'Ruby Hall', 1, 20000000, 0, 1164841200000)",
-			"(26, 0, 'NPC', 'NPC Clan', 'ClanHall', 26, 0, 'Crystal Hall', 1, 20000000, 0, 1164841200000)",
-			"(27, 0, 'NPC', 'NPC Clan', 'ClanHall', 27, 0, 'Onyx Hall', 1, 20000000, 0, 1164841200000)",
-			"(28, 0, 'NPC', 'NPC Clan', 'ClanHall', 28, 0, 'Sapphire Hall', 1, 20000000, 0, 1164841200000)",
-			"(29, 0, 'NPC', 'NPC Clan', 'ClanHall', 29, 0, 'Moonstone Hall', 1, 20000000, 0, 1164841200000)",
-			"(30, 0, 'NPC', 'NPC Clan', 'ClanHall', 30, 0, 'Emerald Hall', 1, 20000000, 0, 1164841200000)",
-			"(31, 0, 'NPC', 'NPC Clan', 'ClanHall', 31, 0, 'The Atramental Barracks', 1, 8000000, 0, 1164841200000)",
-			"(32, 0, 'NPC', 'NPC Clan', 'ClanHall', 32, 0, 'The Scarlet Barracks', 1, 8000000, 0, 1164841200000)",
-			"(33, 0, 'NPC', 'NPC Clan', 'ClanHall', 33, 0, 'The Viridian Barracks', 1, 8000000, 0, 1164841200000)",
-			"(36, 0, 'NPC', 'NPC Clan', 'ClanHall', 36, 0, 'The Golden Chamber', 1, 50000000, 0, 1164841200000)",
-			"(37, 0, 'NPC', 'NPC Clan', 'ClanHall', 37, 0, 'The Silver Chamber', 1, 50000000, 0, 1164841200000)",
-			"(38, 0, 'NPC', 'NPC Clan', 'ClanHall', 38, 0, 'The Mithril Chamber', 1, 50000000, 0, 1164841200000)",
-			"(39, 0, 'NPC', 'NPC Clan', 'ClanHall', 39, 0, 'Silver Manor', 1, 50000000, 0, 1164841200000)",
-			"(40, 0, 'NPC', 'NPC Clan', 'ClanHall', 40, 0, 'Gold Manor', 1, 50000000, 0, 1164841200000)",
-			"(41, 0, 'NPC', 'NPC Clan', 'ClanHall', 41, 0, 'The Bronze Chamber', 1, 50000000, 0, 1164841200000)",
-			"(42, 0, 'NPC', 'NPC Clan', 'ClanHall', 42, 0, 'The Golden Chamber', 1, 50000000, 0, 1164841200000)",
-			"(43, 0, 'NPC', 'NPC Clan', 'ClanHall', 43, 0, 'The Silver Chamber', 1, 50000000, 0, 1164841200000)",
-			"(44, 0, 'NPC', 'NPC Clan', 'ClanHall', 44, 0, 'The Mithril Chamber', 1, 50000000, 0, 1164841200000)",
-			"(45, 0, 'NPC', 'NPC Clan', 'ClanHall', 45, 0, 'The Bronze Chamber', 1, 50000000, 0, 1164841200000)",
-			"(46, 0, 'NPC', 'NPC Clan', 'ClanHall', 46, 0, 'Silver Manor', 1, 50000000, 0, 1164841200000)",
-			"(47, 0, 'NPC', 'NPC Clan', 'ClanHall', 47, 0, 'Moonstone Hall', 1, 50000000, 0, 1164841200000)",
-			"(48, 0, 'NPC', 'NPC Clan', 'ClanHall', 48, 0, 'Onyx Hall', 1, 50000000, 0, 1164841200000)",
-			"(49, 0, 'NPC', 'NPC Clan', 'ClanHall', 49, 0, 'Emerald Hall', 1, 50000000, 0, 1164841200000)",
-			"(50, 0, 'NPC', 'NPC Clan', 'ClanHall', 50, 0, 'Sapphire Hall', 1, 50000000, 0, 1164841200000)",
-			"(51, 0, 'NPC', 'NPC Clan', 'ClanHall', 51, 0, 'Mont Chamber', 1, 50000000, 0, 1164841200000)",
-			"(52, 0, 'NPC', 'NPC Clan', 'ClanHall', 52, 0, 'Astaire Chamber', 1, 50000000, 0, 1164841200000)",
-			"(53, 0, 'NPC', 'NPC Clan', 'ClanHall', 53, 0, 'Aria Chamber', 1, 50000000, 0, 1164841200000)",
-			"(54, 0, 'NPC', 'NPC Clan', 'ClanHall', 54, 0, 'Yiana Chamber', 1, 50000000, 0, 1164841200000)",
-			"(55, 0, 'NPC', 'NPC Clan', 'ClanHall', 55, 0, 'Roien Chamber', 1, 50000000, 0, 1164841200000)",
-			"(56, 0, 'NPC', 'NPC Clan', 'ClanHall', 56, 0, 'Luna Chamber', 1, 50000000, 0, 1164841200000)",
-			"(57, 0, 'NPC', 'NPC Clan', 'ClanHall', 57, 0, 'Traban Chamber', 1, 50000000, 0, 1164841200000)",
-			"(58, 0, 'NPC', 'NPC Clan', 'ClanHall', 58, 0, 'Eisen Hall', 1, 50000000, 0, 1164841200000)",
-			"(59, 0, 'NPC', 'NPC Clan', 'ClanHall', 59, 0, 'Heavy Metal Hall', 1, 50000000, 0, 1164841200000)",
-			"(60, 0, 'NPC', 'NPC Clan', 'ClanHall', 60, 0, 'Molten Ore Hall', 1, 50000000, 0, 1164841200000)",
-			"(61, 0, 'NPC', 'NPC Clan', 'ClanHall', 61, 0, 'Titan Hall', 1, 50000000, 0, 1164841200000)"
+	
+	private static final String[] ITEM_INIT_DATA =
+	{
+		"(22, 0, 'NPC', 'NPC Clan', 'ClanHall', 22, 0, 'Moonstone Hall', 1, 20000000, 0, 1164841200000)",
+		"(23, 0, 'NPC', 'NPC Clan', 'ClanHall', 23, 0, 'Onyx Hall', 1, 20000000, 0, 1164841200000)",
+		"(24, 0, 'NPC', 'NPC Clan', 'ClanHall', 24, 0, 'Topaz Hall', 1, 20000000, 0, 1164841200000)",
+		"(25, 0, 'NPC', 'NPC Clan', 'ClanHall', 25, 0, 'Ruby Hall', 1, 20000000, 0, 1164841200000)",
+		"(26, 0, 'NPC', 'NPC Clan', 'ClanHall', 26, 0, 'Crystal Hall', 1, 20000000, 0, 1164841200000)",
+		"(27, 0, 'NPC', 'NPC Clan', 'ClanHall', 27, 0, 'Onyx Hall', 1, 20000000, 0, 1164841200000)",
+		"(28, 0, 'NPC', 'NPC Clan', 'ClanHall', 28, 0, 'Sapphire Hall', 1, 20000000, 0, 1164841200000)",
+		"(29, 0, 'NPC', 'NPC Clan', 'ClanHall', 29, 0, 'Moonstone Hall', 1, 20000000, 0, 1164841200000)",
+		"(30, 0, 'NPC', 'NPC Clan', 'ClanHall', 30, 0, 'Emerald Hall', 1, 20000000, 0, 1164841200000)",
+		"(31, 0, 'NPC', 'NPC Clan', 'ClanHall', 31, 0, 'The Atramental Barracks', 1, 8000000, 0, 1164841200000)",
+		"(32, 0, 'NPC', 'NPC Clan', 'ClanHall', 32, 0, 'The Scarlet Barracks', 1, 8000000, 0, 1164841200000)",
+		"(33, 0, 'NPC', 'NPC Clan', 'ClanHall', 33, 0, 'The Viridian Barracks', 1, 8000000, 0, 1164841200000)",
+		"(36, 0, 'NPC', 'NPC Clan', 'ClanHall', 36, 0, 'The Golden Chamber', 1, 50000000, 0, 1164841200000)",
+		"(37, 0, 'NPC', 'NPC Clan', 'ClanHall', 37, 0, 'The Silver Chamber', 1, 50000000, 0, 1164841200000)",
+		"(38, 0, 'NPC', 'NPC Clan', 'ClanHall', 38, 0, 'The Mithril Chamber', 1, 50000000, 0, 1164841200000)",
+		"(39, 0, 'NPC', 'NPC Clan', 'ClanHall', 39, 0, 'Silver Manor', 1, 50000000, 0, 1164841200000)",
+		"(40, 0, 'NPC', 'NPC Clan', 'ClanHall', 40, 0, 'Gold Manor', 1, 50000000, 0, 1164841200000)",
+		"(41, 0, 'NPC', 'NPC Clan', 'ClanHall', 41, 0, 'The Bronze Chamber', 1, 50000000, 0, 1164841200000)",
+		"(42, 0, 'NPC', 'NPC Clan', 'ClanHall', 42, 0, 'The Golden Chamber', 1, 50000000, 0, 1164841200000)",
+		"(43, 0, 'NPC', 'NPC Clan', 'ClanHall', 43, 0, 'The Silver Chamber', 1, 50000000, 0, 1164841200000)",
+		"(44, 0, 'NPC', 'NPC Clan', 'ClanHall', 44, 0, 'The Mithril Chamber', 1, 50000000, 0, 1164841200000)",
+		"(45, 0, 'NPC', 'NPC Clan', 'ClanHall', 45, 0, 'The Bronze Chamber', 1, 50000000, 0, 1164841200000)",
+		"(46, 0, 'NPC', 'NPC Clan', 'ClanHall', 46, 0, 'Silver Manor', 1, 50000000, 0, 1164841200000)",
+		"(47, 0, 'NPC', 'NPC Clan', 'ClanHall', 47, 0, 'Moonstone Hall', 1, 50000000, 0, 1164841200000)",
+		"(48, 0, 'NPC', 'NPC Clan', 'ClanHall', 48, 0, 'Onyx Hall', 1, 50000000, 0, 1164841200000)",
+		"(49, 0, 'NPC', 'NPC Clan', 'ClanHall', 49, 0, 'Emerald Hall', 1, 50000000, 0, 1164841200000)",
+		"(50, 0, 'NPC', 'NPC Clan', 'ClanHall', 50, 0, 'Sapphire Hall', 1, 50000000, 0, 1164841200000)",
+		"(51, 0, 'NPC', 'NPC Clan', 'ClanHall', 51, 0, 'Mont Chamber', 1, 50000000, 0, 1164841200000)",
+		"(52, 0, 'NPC', 'NPC Clan', 'ClanHall', 52, 0, 'Astaire Chamber', 1, 50000000, 0, 1164841200000)",
+		"(53, 0, 'NPC', 'NPC Clan', 'ClanHall', 53, 0, 'Aria Chamber', 1, 50000000, 0, 1164841200000)",
+		"(54, 0, 'NPC', 'NPC Clan', 'ClanHall', 54, 0, 'Yiana Chamber', 1, 50000000, 0, 1164841200000)",
+		"(55, 0, 'NPC', 'NPC Clan', 'ClanHall', 55, 0, 'Roien Chamber', 1, 50000000, 0, 1164841200000)",
+		"(56, 0, 'NPC', 'NPC Clan', 'ClanHall', 56, 0, 'Luna Chamber', 1, 50000000, 0, 1164841200000)",
+		"(57, 0, 'NPC', 'NPC Clan', 'ClanHall', 57, 0, 'Traban Chamber', 1, 50000000, 0, 1164841200000)",
+		"(58, 0, 'NPC', 'NPC Clan', 'ClanHall', 58, 0, 'Eisen Hall', 1, 50000000, 0, 1164841200000)",
+		"(59, 0, 'NPC', 'NPC Clan', 'ClanHall', 59, 0, 'Heavy Metal Hall', 1, 50000000, 0, 1164841200000)",
+		"(60, 0, 'NPC', 'NPC Clan', 'ClanHall', 60, 0, 'Molten Ore Hall', 1, 50000000, 0, 1164841200000)",
+		"(61, 0, 'NPC', 'NPC Clan', 'ClanHall', 61, 0, 'Titan Hall', 1, 50000000, 0, 1164841200000)"
 	};
-	private static final Integer[] ItemInitDataId = {
-			23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 41, 42,
-			43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61
+	
+	private static final Integer[] ItemInitDataId =
+	{
+		22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 36, 37, 38, 39, 40, 41, 42,
+		43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61
 	};
 	
 	public static final AuctionManager getInstance()

+ 2 - 1
L2_GameServer/java/net/sf/l2j/gameserver/model/Elementals.java

@@ -14,6 +14,7 @@
  */
 package net.sf.l2j.gameserver.model;
 
+import net.sf.l2j.Config;
 import net.sf.l2j.gameserver.model.actor.L2Character;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
 import net.sf.l2j.gameserver.skills.Stats;
@@ -31,7 +32,7 @@ public final class Elementals
 	public final static byte HOLY = 4;
 	public final static byte DARK = 5;
 
-	public final static int ENCHANT_CHANCE = 50;
+	public final static int ENCHANT_CHANCE = Config.ENCHANT_CHANCE_ELEMENT;
 
 	public final static int FIRST_WEAPON_BONUS = 20;
 	public final static int NEXT_WEAPON_BONUS = 5;

+ 1 - 1
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java

@@ -657,7 +657,7 @@ public class CharStat
 		if (skill == null)
 			return 1;
 		int mpconsume = skill.getMpConsume();
-		if (skill.isDance() && _activeChar != null && _activeChar.getDanceCount() > 0)
+		if (Config.DANCE_CONSUME_ADDITIONAL_MP && skill.isDance() && _activeChar != null && _activeChar.getDanceCount() > 0)
 			mpconsume += _activeChar.getDanceCount() * skill.getNextDanceMpCost();
 		
 		return (int) calcStat(Stats.MP_CONSUME, mpconsume, null, skill);

+ 66 - 92
L2_GameServer/java/net/sf/l2j/gameserver/network/clientpackets/RequestCrystallizeItem.java

@@ -25,8 +25,6 @@ import net.sf.l2j.gameserver.model.itemcontainer.PcInventory;
 import net.sf.l2j.gameserver.network.SystemMessageId;
 import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate;
-import net.sf.l2j.gameserver.network.serverpackets.ItemList;
-import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate;
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 import net.sf.l2j.gameserver.templates.item.L2Item;
 import net.sf.l2j.gameserver.util.Util;
@@ -65,7 +63,7 @@ public final class RequestCrystallizeItem extends L2GameClientPacket
 
 		if (_count <= 0)
 		{
-			Util.handleIllegalPlayerAction(activeChar, "[RequestCrystallizeItem] Character " + activeChar.getName() + " of account " + activeChar.getAccountName() + " tried to crystalize item with oid " + _objectId + " but has count <= 0!", Config.DEFAULT_PUNISH);
+			Util.handleIllegalPlayerAction(activeChar, "[RequestCrystallizeItem] count <= 0! ban! oid: " + _objectId + " owner: " + activeChar.getName(), Config.DEFAULT_PUNISH);
 			return;
 		}
 
@@ -78,9 +76,7 @@ public final class RequestCrystallizeItem extends L2GameClientPacket
 		int skillLevel = activeChar.getSkillLevel(L2Skill.SKILL_CRYSTALLIZE);
 		if (skillLevel <= 0)
 		{
-			SystemMessage sm = new SystemMessage(SystemMessageId.CRYSTALLIZE_LEVEL_TOO_LOW);
-			activeChar.sendPacket(sm);
-			sm = null;
+			activeChar.sendPacket(new SystemMessage(SystemMessageId.CRYSTALLIZE_LEVEL_TOO_LOW));
 			activeChar.sendPacket(ActionFailed.STATIC_PACKET);
 			return;
 		}
@@ -99,9 +95,7 @@ public final class RequestCrystallizeItem extends L2GameClientPacket
 				return;
 
 			if (_count > item.getCount())
-			{
 				_count = activeChar.getInventory().getItemByObjectId(_objectId).getCount();
-			}
 		}
 
 		L2ItemInstance itemToRemove = activeChar.getInventory().getItemByObjectId(_objectId);
@@ -109,9 +103,8 @@ public final class RequestCrystallizeItem extends L2GameClientPacket
 				|| itemToRemove.isWear()
 				|| itemToRemove.isShadowItem()
 				|| itemToRemove.isTimeLimitedItem())
-		{
 			return;
-		}
+
 		if (!itemToRemove.getItem().isCrystallizable()
 				|| (itemToRemove.getItem().getCrystalCount() <= 0)
 				|| (itemToRemove.getItem().getCrystalType() == L2Item.CRYSTAL_NONE))
@@ -120,54 +113,44 @@ public final class RequestCrystallizeItem extends L2GameClientPacket
 			return;
 		}
 
-        // Check if the char can crystallize items and return if false;
-        boolean canCrystallize = true;
-
-        switch (itemToRemove.getItem().getItemGradeSPlus())
-        {
-            case L2Item.CRYSTAL_C:
-            {
-                if (skillLevel <= 1)
-                {
-                    canCrystallize = false;
-                }
-                break;
-            }
-            case L2Item.CRYSTAL_B:
-            {
-                if (skillLevel <= 2)
-                {
-                    canCrystallize = false;
-                }
-                break;
-            }
-            case L2Item.CRYSTAL_A:
-            {
-                if (skillLevel <= 3)
-                {
-                    canCrystallize = false;
-                }
-                break;
-            }
-            case L2Item.CRYSTAL_S:
-            {
-                if (skillLevel <= 4)
-                {
-                    canCrystallize = false;
-                }
-                break;
-            }
-        }
-        
-        if (!canCrystallize)
-        {
-            SystemMessage sm = new SystemMessage(SystemMessageId.CRYSTALLIZE_LEVEL_TOO_LOW);
-            activeChar.sendPacket(sm);
-            sm = null;
-            activeChar.sendPacket(ActionFailed.STATIC_PACKET);
-            return;
-        }
-        
+		// Check if the char can crystallize items and return if false;
+		boolean canCrystallize = true;
+
+		switch (itemToRemove.getItem().getItemGradeSPlus())
+		{
+			case L2Item.CRYSTAL_C:
+			{
+				if (skillLevel <= 1)
+					canCrystallize = false;
+				break;
+			}
+			case L2Item.CRYSTAL_B:
+			{
+				if (skillLevel <= 2)
+					canCrystallize = false;
+				break;
+			}
+			case L2Item.CRYSTAL_A:
+			{
+				if (skillLevel <= 3)
+					canCrystallize = false;
+				break;
+			}
+			case L2Item.CRYSTAL_S:
+			{
+				if (skillLevel <= 4)
+					canCrystallize = false;
+				break;
+			}
+		}
+
+		if (!canCrystallize)
+		{
+			activeChar.sendPacket(new SystemMessage(SystemMessageId.CRYSTALLIZE_LEVEL_TOO_LOW));
+			activeChar.sendPacket(ActionFailed.STATIC_PACKET);
+			return;
+		}
+
 		activeChar.setInCrystallize(true);
 
 		// unequip if needed
@@ -176,54 +159,45 @@ public final class RequestCrystallizeItem extends L2GameClientPacket
 			L2ItemInstance[] unequiped = activeChar.getInventory().unEquipItemInSlotAndRecord(itemToRemove.getLocationSlot());
 			InventoryUpdate iu = new InventoryUpdate();
 			for (L2ItemInstance item: unequiped)
-			{
 				iu.addModifiedItem(item);
-			}
 			activeChar.sendPacket(iu);
-			// activeChar.updatePDef();
-			// activeChar.updatePAtk();
-			// activeChar.updateMDef();
-			// activeChar.updateMAtk();
-			// activeChar.updateAccuracy();
-			// activeChar.updateCriticalChance();
+
+			SystemMessage msg;
+			if (itemToRemove.getEnchantLevel() > 0)
+			{
+				msg = new SystemMessage(SystemMessageId.EQUIPMENT_S1_S2_REMOVED);
+				msg.addNumber(itemToRemove.getEnchantLevel());
+				msg.addItemName(itemToRemove);
+			}
+			else
+			{
+				msg = new SystemMessage(SystemMessageId.S1_DISARMED);
+				msg.addItemName(itemToRemove);
+			}
+			activeChar.sendPacket(msg);
 		}
 
 		// remove from inventory
 		L2ItemInstance removedItem = activeChar.getInventory().destroyItem("Crystalize", _objectId, _count, activeChar, null);
 
+		InventoryUpdate iu = new InventoryUpdate();
+		iu.addRemovedItem(removedItem);
+		activeChar.sendPacket(iu);
+
 		// add crystals
 		int crystalId = itemToRemove.getItem().getCrystalItemId();
 		int crystalAmount = itemToRemove.getCrystalCount();
-		L2ItemInstance createditem = activeChar.getInventory().addItem("Crystalize", crystalId, crystalAmount, activeChar, itemToRemove);
+		L2ItemInstance createditem = activeChar.getInventory().addItem("Crystalize", crystalId, crystalAmount, activeChar, activeChar);
 
-		SystemMessage sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S);
+		SystemMessage sm;
+		sm = new SystemMessage(SystemMessageId.S1_CRYSTALLIZED);
+		sm.addItemName(removedItem);
+		activeChar.sendPacket(sm);
+
+		sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S);
 		sm.addItemName(createditem);
 		sm.addItemNumber(crystalAmount);
 		activeChar.sendPacket(sm);
-		sm = null;
-
-		// send inventory update
-		if (!Config.FORCE_INVENTORY_UPDATE)
-		{
-			InventoryUpdate iu = new InventoryUpdate();
-			if (removedItem.getCount() == 0)
-				iu.addRemovedItem(removedItem);
-			else
-				iu.addModifiedItem(removedItem);
-
-			if (createditem.getCount() != crystalAmount)
-				iu.addModifiedItem(createditem);
-			else
-				iu.addNewItem(createditem);
-
-			activeChar.sendPacket(iu);
-		} else
-			activeChar.sendPacket(new ItemList(activeChar, false));
-
-		// status & user info
-		StatusUpdate su = new StatusUpdate(activeChar.getObjectId());
-		su.addAttribute(StatusUpdate.CUR_LOAD, activeChar.getCurrentLoad());
-		activeChar.sendPacket(su);
 
 		activeChar.broadcastUserInfo();
 

+ 11 - 15
L2_GameServer/java/net/sf/l2j/gameserver/network/serverpackets/MagicSkillUse.java

@@ -30,7 +30,7 @@ import net.sf.l2j.gameserver.model.actor.L2Character;
 public final class MagicSkillUse extends L2GameServerPacket
 {
 	private static final String _S__5A_MAGICSKILLUSER = "[S] 48 MagicSkillUser";
-	private int _targetId;
+	private int _targetId, _tx, _ty, _tz;
 	private int _skillId;
 	private int _skillLevel;
 	private int _hitTime;
@@ -49,6 +49,9 @@ public final class MagicSkillUse extends L2GameServerPacket
 		_x = cha.getX();
 		_y = cha.getY();
 		_z = cha.getZ();
+		_tx = target.getX();
+		_ty = target.getY();
+		_tz = target.getZ();
 		_flags |= 0x20;
 	}
 
@@ -63,6 +66,9 @@ public final class MagicSkillUse extends L2GameServerPacket
 		_x = cha.getX();
 		_y = cha.getY();
 		_z = cha.getZ();
+		_tx = cha.getX();
+		_ty = cha.getY();
+		_tz = cha.getZ();
 		_flags |= 0x20;
 	}
 
@@ -79,18 +85,10 @@ public final class MagicSkillUse extends L2GameServerPacket
 		writeD(_x);
 		writeD(_y);
 		writeD(_z);
-
-		writeH(0x00); // unknown loop but not AoE
-		writeH(0x00);
-		//for()
-		//{
-		//	writeH(0x00);
-		//	writeH(0x00);
-		//	writeH(0x00);
-		//}
-		writeD(0x00);
-		writeD(0x00);
-		writeD(0x00);
+		writeD(0x00); // unknown
+		writeD(_tx);
+		writeD(_ty);
+		writeD(_tz);
 	}
 
 	/* (non-Javadoc)
@@ -101,6 +99,4 @@ public final class MagicSkillUse extends L2GameServerPacket
 	{
 		return _S__5A_MAGICSKILLUSER;
 	}
-
 }
-

+ 11 - 3
L2_GameServer/java/net/sf/l2j/gameserver/skills/effects/EffectDamOverTime.java

@@ -48,14 +48,22 @@ public class EffectDamOverTime extends L2Effect
 		if (getEffected().isDead())
 			return false;
 		
-		double damage = calc();
+		if (!getSkill().isToggle())
+		{
+			L2Effect[] effects = getEffected().getAllEffects();
+			for (L2Effect e : effects)
+			{
+				if (e != null && e.getStackType().equals("sleep"))
+					e.exit();
+			}
+		}
 		
+		double damage = calc();
 		if (damage >= getEffected().getCurrentHp() - 1)
 		{
 			if (getSkill().isToggle())
 			{
-				SystemMessage sm = new SystemMessage(SystemMessageId.SKILL_REMOVED_DUE_LACK_HP);
-				getEffected().sendPacket(sm);
+				getEffected().sendPacket(new SystemMessage(SystemMessageId.SKILL_REMOVED_DUE_LACK_HP));
 				return false;
 			}