diff --git a/trunk/dist/game/data/AppearanceStones.xml b/trunk/dist/game/data/AppearanceStones.xml
index a3e758bdd7..c47b86793b 100644
--- a/trunk/dist/game/data/AppearanceStones.xml
+++ b/trunk/dist/game/data/AppearanceStones.xml
@@ -1,52 +1,492 @@
-
-
-
-
-
-
-
+
+ R
+ R95
+ R99
+
+
+ S
+ S80
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+ R
+ R95
+ R99
+
+
+ S
+ S80
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+ R
+ R95
+ R99
+
+
+ S
+ S80
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ R
+ R95
+ R99
+
+
+ S
+ S80
+
+
+
+
+
+
+
+
+ R
+ R95
+ R99
+
+
+ S
+ S80
+
+
+
+
+
+
+
+
+ R
+ R95
+ R99
+
+
+ S
+ S80
+
+
+
+
+
+
+
+
+ R
+ R95
+ R99
+ WEAPON
+ ARMOR
+
+
+ S
+ S80
+ WEAPON
+ ARMOR
+
+
+ WEAPON
+ ARMOR
+
+
+ WEAPON
+ ARMOR
+
+
+ WEAPON
+ ARMOR
+
+
+ WEAPON
+ ARMOR
+
+
+
+
+
+ chest
+ fullarmor
+
+
+
+
+
+ hair
+ hair2
+ hairall
+
+
+
+
+ chest
+ fullarmor
+
+
+
+
+
+
+
+ chest
+ fullarmor
+
+
+
+
+
+ hair
+ hair2
+ hairall
+
+
+
+
+ chest
+ fullarmor
+
+
+
+
+
+
+
+ chest
+ fullarmor
+
+
+
+
+
+ hair
+ hair2
+ hairall
+
+
+
+
+ chest
+ fullarmor
+
+
+
+
+
+
+
+ chest
+ fullarmor
+
+
+
+
+
+ hair
+ hair2
+ hairall
+
+
+
+
+ chest
+ fullarmor
+
+
+ chest
+ fullarmor
+
+
+ chest
+ fullarmor
+
+
+ chest
+ fullarmor
+
+
+ chest
+ fullarmor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ chest
+ fullarmor
+
+
+
+
+ chest
+ fullarmor
+
+
+
+
+ chest
+ fullarmor
+
+
+
+
+
+ hair
+ hair2
+ hairall
+
+
+
+
+ chest
+ fullarmor
+
+
+ hair
+ hair2
+ hairall
+
+
+
+
+ chest
+ fullarmor
+
+
+ hair
+ hair2
+ hairall
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/trunk/dist/game/data/scripts/handlers/itemhandlers/Appearance.java b/trunk/dist/game/data/scripts/handlers/itemhandlers/Appearance.java
index 8cced60fa9..45ae30b0e2 100644
--- a/trunk/dist/game/data/scripts/handlers/itemhandlers/Appearance.java
+++ b/trunk/dist/game/data/scripts/handlers/itemhandlers/Appearance.java
@@ -18,15 +18,18 @@
*/
package handlers.itemhandlers;
+import com.l2jserver.gameserver.data.xml.impl.AppearanceItemData;
import com.l2jserver.gameserver.handler.IItemHandler;
import com.l2jserver.gameserver.model.actor.L2Playable;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.actor.request.ShapeShiftingItemRequest;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceStone;
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.network.serverpackets.itemappearance.ExChoose_Shape_Shifting_Item;
+import com.l2jserver.gameserver.network.serverpackets.appearance.ExChooseShapeShiftingItem;
/**
- * @author Erlandys
+ * @author UnAfraid
*/
public class Appearance implements IItemHandler
{
@@ -40,21 +43,21 @@ public class Appearance implements IItemHandler
}
final L2PcInstance player = playable.getActingPlayer();
-
- if (player.getUsingAppearanceStone() != null)
+ if (player.hasRequest(ShapeShiftingItemRequest.class))
{
player.sendPacket(SystemMessageId.APPEARANCE_MODIFICATION_OR_RESTORATION_IN_PROGRESS_PLEASE_TRY_AGAIN_AFTER_COMPLETING_THIS_TASK);
return false;
}
- if ((item == null) || !item.isEtcItem() || (item.isEtcItem() && (item.getEtcItem().getAppearanceStone() == null)))
+ final AppearanceStone stone = AppearanceItemData.getInstance().getStone(item.getId());
+ if (stone == null)
{
player.sendMessage("This item is either not an appearance stone or is currently not handled!");
return false;
}
- player.sendPacket(new ExChoose_Shape_Shifting_Item(item.getEtcItem().getAppearanceStone()));
- player.setUsingAppearanceStone(item);
+ player.addRequest(new ShapeShiftingItemRequest(player, item));
+ player.sendPacket(new ExChooseShapeShiftingItem(stone));
return true;
}
}
diff --git a/trunk/dist/game/data/xsd/AppearanceStones.xsd b/trunk/dist/game/data/xsd/AppearanceStones.xsd
index 185eccace1..7399b14f37 100644
--- a/trunk/dist/game/data/xsd/AppearanceStones.xsd
+++ b/trunk/dist/game/data/xsd/AppearanceStones.xsd
@@ -1,20 +1,258 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/trunk/dist/tools/sql/game/item_variables.sql b/trunk/dist/tools/sql/game/item_variables.sql
new file mode 100644
index 0000000000..79b8068815
--- /dev/null
+++ b/trunk/dist/tools/sql/game/item_variables.sql
@@ -0,0 +1,6 @@
+CREATE TABLE IF NOT EXISTS `item_variables` (
+ `id` int(10) UNSIGNED NOT NULL,
+ `var` varchar(255) NOT NULL,
+ `val` text NOT NULL,
+ KEY `charId` (`id`)
+);
\ No newline at end of file
diff --git a/trunk/dist/tools/sql/game/items.sql b/trunk/dist/tools/sql/game/items.sql
index f94a528c77..a79b46b0ce 100644
--- a/trunk/dist/tools/sql/game/items.sql
+++ b/trunk/dist/tools/sql/game/items.sql
@@ -11,8 +11,6 @@ CREATE TABLE IF NOT EXISTS `items` (
`custom_type2` INT DEFAULT 0,
`mana_left` decimal(5,0) NOT NULL DEFAULT -1,
`time` decimal(13) NOT NULL DEFAULT 0,
- `appearance_id` int(11) NOT NULL DEFAULT 0,
- `appearance_time` decimal(13) NOT NULL DEFAULT -1,
PRIMARY KEY (`object_id`),
KEY `owner_id` (`owner_id`),
KEY `item_id` (`item_id`),
diff --git a/trunk/java/com/l2jserver/gameserver/data/xml/impl/AppearanceItemData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/AppearanceItemData.java
index c94fabaef2..980f6458f0 100644
--- a/trunk/java/com/l2jserver/gameserver/data/xml/impl/AppearanceItemData.java
+++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/AppearanceItemData.java
@@ -18,7 +18,6 @@
*/
package com.l2jserver.gameserver.data.xml.impl;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
@@ -28,15 +27,17 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import com.l2jserver.gameserver.data.xml.IXmlReader;
-import com.l2jserver.gameserver.model.entity.AppearanceStone;
-import com.l2jserver.gameserver.model.entity.AppearanceStone.AppearanceItemType;
-import com.l2jserver.gameserver.model.entity.AppearanceStone.StoneType;
+import com.l2jserver.gameserver.datatables.ItemTable;
+import com.l2jserver.gameserver.enums.Race;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceStone;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceTargetType;
import com.l2jserver.gameserver.model.items.type.CrystalType;
/**
- * @author Erlandys
+ * @author UnAfraid
*/
-public final class AppearanceItemData implements IXmlReader
+public class AppearanceItemData implements IXmlReader
{
private final Map _stones = new HashMap<>();
@@ -48,42 +49,88 @@ public final class AppearanceItemData implements IXmlReader
@Override
public void load()
{
- _stones.clear();
parseDatapackFile("data/AppearanceStones.xml");
- LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _stones.size() + " appearance stones.");
+ LOGGER.log(Level.INFO, getClass().getSimpleName() + ": Loaded: " + _stones.size() + " Stones");
+
+ //@formatter:off
+ /*
+ for (L2Item item : ItemTable.getInstance().getAllItems())
+ {
+ if ((item == null) || !item.getName().contains("Appearance Stone"))
+ {
+ continue;
+ }
+ if (item.getName().contains("Pack") || _stones.containsKey(item.getId()))
+ {
+ continue;
+ }
+
+ System.out.println("Unhandled appearance stone: " + item);
+ }
+ */
+ //@formatter:on
}
@Override
public void parseDocument(Document doc)
{
+ StatsSet set;
+ Node att;
+ NamedNodeMap attrs;
for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
{
if ("list".equalsIgnoreCase(n.getNodeName()))
{
for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
{
- if ("stone".equalsIgnoreCase(d.getNodeName()))
+ if ("appearance_stone".equalsIgnoreCase(d.getNodeName()))
{
- final NamedNodeMap attrs = d.getAttributes();
- int itemId = parseInteger(attrs, "id");
- String type = parseString(attrs, "type");
- String targetType = parseString(attrs, "targetType");
- String grades[] = parseString(attrs, "grades", "none").split(";");
- long cost = parseLong(attrs, "cost", 0l);
- int visualId = parseInteger(attrs, "visualId", 0);
- long lifeTime = parseLong(attrs, "lifeTime", 0l);
- ArrayList gradesIds = new ArrayList<>();
- CrystalType cType;
- for (String gr : grades)
+ attrs = d.getAttributes();
+ set = new StatsSet();
+ for (int i = 0; i < attrs.getLength(); i++)
{
- cType = CrystalType.valueOf(gr.toUpperCase());
- gradesIds.add(cType.getId());
+ att = attrs.item(i);
+ set.set(att.getNodeName(), att.getNodeValue());
}
- type = type.toUpperCase();
- targetType = targetType.toUpperCase();
- StoneType sType = StoneType.valueOf(type);
- AppearanceItemType iType = AppearanceItemType.valueOf(targetType);
- _stones.put(itemId, new AppearanceStone(itemId, sType, iType, gradesIds, cost, visualId, lifeTime));
+
+ final AppearanceStone stone = new AppearanceStone(set);
+ for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
+ {
+ switch (c.getNodeName())
+ {
+ case "grade":
+ {
+ final CrystalType type = CrystalType.valueOf(c.getTextContent());
+ stone.addCrystalType(type);
+ break;
+ }
+ case "targetType":
+ {
+ final AppearanceTargetType type = AppearanceTargetType.valueOf(c.getTextContent());
+ stone.addTargetType(type);
+ break;
+ }
+ case "bodyPart":
+ {
+ final int part = ItemTable._slots.get(c.getTextContent());
+ stone.addBodyPart(part);
+ break;
+ }
+ case "race":
+ {
+ final Race race = Race.valueOf(c.getTextContent());
+ stone.addRace(race);
+ break;
+ }
+ case "raceNot":
+ {
+ final Race raceNot = Race.valueOf(c.getTextContent());
+ stone.addRaceNot(raceNot);
+ break;
+ }
+ }
+ }
+ _stones.put(stone.getId(), stone);
}
}
}
diff --git a/trunk/java/com/l2jserver/gameserver/data/xml/impl/ArmorSetsData.java b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ArmorSetsData.java
index 2a95c7517a..9329efc206 100644
--- a/trunk/java/com/l2jserver/gameserver/data/xml/impl/ArmorSetsData.java
+++ b/trunk/java/com/l2jserver/gameserver/data/xml/impl/ArmorSetsData.java
@@ -68,6 +68,7 @@ public final class ArmorSetsData implements IXmlReader
if ("set".equalsIgnoreCase(d.getNodeName()))
{
set = new L2ArmorSet();
+ set.setIsVisual(parseBoolean(d.getAttributes(), "visual", false));
set.setMinimumPieces(parseInteger(d.getAttributes(), "minimumPieces"));
for (Node a = d.getFirstChild(); a != null; a = a.getNextSibling())
diff --git a/trunk/java/com/l2jserver/gameserver/model/ItemInfo.java b/trunk/java/com/l2jserver/gameserver/model/ItemInfo.java
index 7de39c26a0..684efbc882 100644
--- a/trunk/java/com/l2jserver/gameserver/model/ItemInfo.java
+++ b/trunk/java/com/l2jserver/gameserver/model/ItemInfo.java
@@ -75,7 +75,6 @@ public class ItemInfo
};
private int[] _option;
-
private int _visualId;
private long _visualExpiration;
@@ -152,13 +151,13 @@ public class ItemInfo
}
_option = item.getEnchantOptions();
_visualId = item.getVisualId();
- _visualExpiration = item.getAppearanceTime();
}
public ItemInfo(L2ItemInstance item, int change)
{
this(item);
_change = change;
+ _visualExpiration = item.getVisualLifeTime() > 0 ? (item.getVisualLifeTime() - System.currentTimeMillis()) / 1000 : 0;
}
public ItemInfo(TradeItem item)
@@ -201,8 +200,9 @@ public class ItemInfo
_change = 0;
// Get shadow item mana
- _mana = item.getMana();
- _time = item.isTimeLimitedItem() ? (int) (item.getRemainingTime() / 1000) : -9999;
+ _mana = -1;
+ _time = -9999;
+
_location = item.getLocationSlot();
_elemAtkType = item.getAttackElementType();
@@ -211,9 +211,9 @@ public class ItemInfo
{
_elemDefAttr[i] = item.getElementDefAttr(i);
}
+
_option = item.getEnchantOptions();
_visualId = item.getVisualId();
- _visualExpiration = item.getVisualExpiration();
}
public ItemInfo(Product item)
@@ -303,8 +303,6 @@ public class ItemInfo
_elemDefAttr[i] = item.getElementDefAttr(i);
}
_option = item.getEnchantOptions();
- _visualId = item.getAppearanceId();
- _visualExpiration = item.getAppearanceTime();
}
public int getObjectId()
@@ -364,7 +362,7 @@ public class ItemInfo
public int getTime()
{
- return _time;
+ return _time > 0 ? _time : _visualExpiration > 0 ? (int) _visualExpiration : -9999;
}
public int getLocation()
diff --git a/trunk/java/com/l2jserver/gameserver/model/L2ArmorSet.java b/trunk/java/com/l2jserver/gameserver/model/L2ArmorSet.java
index 6ef31b958c..02e31e59e4 100644
--- a/trunk/java/com/l2jserver/gameserver/model/L2ArmorSet.java
+++ b/trunk/java/com/l2jserver/gameserver/model/L2ArmorSet.java
@@ -33,6 +33,7 @@ import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
*/
public final class L2ArmorSet
{
+ private boolean _isVisual;
private int _minimumPieces;
private final List _chests;
private final List _legs;
@@ -75,6 +76,16 @@ public final class L2ArmorSet
_enchantSkills = new ArrayList<>();
}
+ public boolean isVisual()
+ {
+ return _isVisual;
+ }
+
+ public void setIsVisual(boolean val)
+ {
+ _isVisual = val;
+ }
+
/**
* @return the minimum amount of pieces equipped to form a set.
*/
@@ -329,6 +340,39 @@ public final class L2ArmorSet
}
+ public int getVisualPiecesCount(L2PcInstance player)
+ {
+ final Inventory inv = player.getInventory();
+
+ final L2ItemInstance legsItem = inv.getPaperdollItem(Inventory.PAPERDOLL_LEGS);
+ final L2ItemInstance headItem = inv.getPaperdollItem(Inventory.PAPERDOLL_HEAD);
+ final L2ItemInstance glovesItem = inv.getPaperdollItem(Inventory.PAPERDOLL_GLOVES);
+ final L2ItemInstance feetItem = inv.getPaperdollItem(Inventory.PAPERDOLL_FEET);
+
+ int legs = 0;
+ int head = 0;
+ int gloves = 0;
+ int feet = 0;
+
+ if (legsItem != null)
+ {
+ legs = legsItem.getVisualId();
+ }
+ if (headItem != null)
+ {
+ head = headItem.getVisualId();
+ }
+ if (glovesItem != null)
+ {
+ gloves = glovesItem.getVisualId();
+ }
+ if (feetItem != null)
+ {
+ feet = feetItem.getVisualId();
+ }
+ return getPiecesCount(legs, head, gloves, feet);
+ }
+
public int getCON()
{
return _con;
diff --git a/trunk/java/com/l2jserver/gameserver/model/TradeItem.java b/trunk/java/com/l2jserver/gameserver/model/TradeItem.java
index 26bb9865af..a1ab59afa7 100644
--- a/trunk/java/com/l2jserver/gameserver/model/TradeItem.java
+++ b/trunk/java/com/l2jserver/gameserver/model/TradeItem.java
@@ -77,7 +77,7 @@ public class TradeItem
_isTimeLimited = item.isTimeLimitedItem();
_time = item.isTimeLimitedItem() ? (int) (item.getRemainingTime() / 1000) : -9999;
_visualId = item.getVisualId();
- _visualExpiration = item.getAppearanceTime();
+ _visualExpiration = item.getTime();
}
public TradeItem(L2Item item, long count, long price, int enchantLevel, int attackAttribute, int attackAttributeValue, int defenseAttributes[], int appearanceId)
diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
index b49c6d26aa..2a20456e8e 100644
--- a/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
+++ b/trunk/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
@@ -161,6 +161,7 @@ import com.l2jserver.gameserver.model.actor.L2Summon;
import com.l2jserver.gameserver.model.actor.L2Vehicle;
import com.l2jserver.gameserver.model.actor.appearance.PcAppearance;
import com.l2jserver.gameserver.model.actor.knownlist.PcKnownList;
+import com.l2jserver.gameserver.model.actor.request.AbstractRequest;
import com.l2jserver.gameserver.model.actor.stat.PcStat;
import com.l2jserver.gameserver.model.actor.status.PcStatus;
import com.l2jserver.gameserver.model.actor.tasks.player.DismountTask;
@@ -759,6 +760,8 @@ public final class L2PcInstance extends L2Playable
private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0;
+ private volatile Map, AbstractRequest> _requests;
+
private boolean _isEnchanting = false;
private int _activeEnchantItemId = ID_NONE;
private int _activeEnchantSupportItemId = ID_NONE;
@@ -767,9 +770,6 @@ public final class L2PcInstance extends L2Playable
private int _firstCompoundOID = -1;
private int _secondCompoundOID = -1;
- private L2ItemInstance _usingAStone = null;
- private L2ItemInstance _appearanceItem = null;
- private L2ItemInstance _targetAppearanceItem = null;
private boolean _usingPrimeShop = false;
@@ -15044,6 +15044,105 @@ public final class L2PcInstance extends L2Playable
return getServitors().values().stream().mapToInt(L2Summon::getSummonPoints).sum();
}
+ /**
+ * @param request
+ * @return {@code true} if the request was registered successfully, {@code false} otherwise.
+ */
+ public boolean addRequest(AbstractRequest request)
+ {
+ if (_requests == null)
+ {
+ synchronized (this)
+ {
+ if (_requests == null)
+ {
+ _requests = new ConcurrentHashMap<>();
+ }
+ }
+ }
+ return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
+ }
+
+ public boolean canRequest(AbstractRequest request)
+ {
+ return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith);
+ }
+
+ /**
+ * @param clazz
+ * @return {@code true} if request was successfully removed, {@code false} in case processing set is not created or not containing the request.
+ */
+ public boolean removeRequest(Class extends AbstractRequest> clazz)
+ {
+ return (_requests != null) && (_requests.remove(clazz) != null);
+ }
+
+ /**
+ * @param
+ * @param requestClass
+ * @return object that is instance of {@code requestClass} param, {@code null} if not instance or not set.
+ */
+ public T getRequest(Class requestClass)
+ {
+ return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null;
+ }
+
+ /**
+ * @return {@code true} if player has any processing request set, {@code false} otherwise.
+ */
+ public boolean hasRequests()
+ {
+ return (_requests != null) && !_requests.isEmpty();
+ }
+
+ public boolean hasItemRequest()
+ {
+ return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
+ }
+
+ /**
+ * @param requestClass
+ * @param classes
+ * @return {@code true} if player has the provided request and processing it, {@code false} otherwise.
+ */
+ @SafeVarargs
+ public final boolean hasRequest(Class extends AbstractRequest> requestClass, Class extends AbstractRequest>... classes)
+ {
+ if (_requests != null)
+ {
+ for (Class extends AbstractRequest> clazz : classes)
+ {
+ if (_requests.containsKey(clazz))
+ {
+ return true;
+ }
+ }
+ return _requests.containsKey(requestClass);
+ }
+ return false;
+ }
+
+ /**
+ * @param objectId
+ * @return {@code true} if item object id is currently in use by some request, {@code false} otherwise.
+ */
+ public boolean isProcessingItem(int objectId)
+ {
+ return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
+ }
+
+ /**
+ * Removing all requests associated with the item object id provided.
+ * @param objectId
+ */
+ public void removeRequestsThatProcessesItem(int objectId)
+ {
+ if (_requests != null)
+ {
+ _requests.values().removeIf(req -> req.isUsing(objectId));
+ }
+ }
+
/*
* Return current vitality points in integer format
*/
@@ -15094,36 +15193,6 @@ public final class L2PcInstance extends L2Playable
_secondCompoundOID = secondCompoundOID;
}
- public L2ItemInstance getUsingAppearanceStone()
- {
- return _usingAStone;
- }
-
- public void setUsingAppearanceStone(L2ItemInstance stone)
- {
- _usingAStone = stone;
- }
-
- public L2ItemInstance getAppearanceItem()
- {
- return _appearanceItem;
- }
-
- public void setAppearanceItem(L2ItemInstance item)
- {
- _appearanceItem = item;
- }
-
- public L2ItemInstance getTargetAppearanceItem()
- {
- return _targetAppearanceItem;
- }
-
- public void setTargetAppearanceItem(L2ItemInstance item)
- {
- _targetAppearanceItem = item;
- }
-
public void setUsingPrimeShop(boolean isUsing)
{
_usingPrimeShop = isUsing;
diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/request/AbstractRequest.java b/trunk/java/com/l2jserver/gameserver/model/actor/request/AbstractRequest.java
new file mode 100644
index 0000000000..3090adde6e
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/model/actor/request/AbstractRequest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.model.actor.request;
+
+import java.util.Objects;
+import java.util.concurrent.ScheduledFuture;
+
+import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * @author UnAfraid
+ */
+public abstract class AbstractRequest
+{
+ private final L2PcInstance _activeChar;
+ private volatile long _timestamp = 0;
+ private volatile boolean _isProcessing;
+ private ScheduledFuture> _timeOutTask;
+
+ public AbstractRequest(L2PcInstance activeChar)
+ {
+ Objects.requireNonNull(activeChar);
+ _activeChar = activeChar;
+ }
+
+ public L2PcInstance getActiveChar()
+ {
+ return _activeChar;
+ }
+
+ public long getTimestamp()
+ {
+ return _timestamp;
+ }
+
+ public void setTimestamp(long timestamp)
+ {
+ _timestamp = timestamp;
+ }
+
+ public void scheduleTimeout(long delay)
+ {
+ _timeOutTask = ThreadPoolManager.getInstance().scheduleGeneral(this::onTimeout, delay);
+ }
+
+ public boolean isTimeout()
+ {
+ return (_timeOutTask != null) && !_timeOutTask.isDone();
+ }
+
+ public boolean isProcessing()
+ {
+ return _isProcessing;
+ }
+
+ public boolean setProcessing(boolean isProcessing)
+ {
+ return _isProcessing = isProcessing;
+ }
+
+ public boolean canWorkWith(AbstractRequest request)
+ {
+ return true;
+ }
+
+ public boolean isItemRequest()
+ {
+ return false;
+ }
+
+ public abstract boolean isUsing(int objectId);
+
+ public void onTimeout()
+ {
+
+ }
+}
diff --git a/trunk/java/com/l2jserver/gameserver/model/actor/request/ShapeShiftingItemRequest.java b/trunk/java/com/l2jserver/gameserver/model/actor/request/ShapeShiftingItemRequest.java
new file mode 100644
index 0000000000..9c3e9d706d
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/model/actor/request/ShapeShiftingItemRequest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.model.actor.request;
+
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
+
+/**
+ * @author Sdw
+ */
+public class ShapeShiftingItemRequest extends AbstractRequest
+{
+ private L2ItemInstance _appearanceStone;
+ private L2ItemInstance _appearanceExtractItem;
+
+ public ShapeShiftingItemRequest(L2PcInstance activeChar, L2ItemInstance appearanceStone)
+ {
+ super(activeChar);
+ _appearanceStone = appearanceStone;
+ }
+
+ public L2ItemInstance getAppearanceStone()
+ {
+ return _appearanceStone;
+ }
+
+ public void setAppearanceStone(L2ItemInstance appearanceStone)
+ {
+ _appearanceStone = appearanceStone;
+ }
+
+ public L2ItemInstance getAppearanceExtractItem()
+ {
+ return _appearanceExtractItem;
+ }
+
+ public void setAppearanceExtractItem(L2ItemInstance appearanceExtractItem)
+ {
+ _appearanceExtractItem = appearanceExtractItem;
+ }
+
+ @Override
+ public boolean isItemRequest()
+ {
+ return true;
+ }
+
+ @Override
+ public boolean canWorkWith(AbstractRequest request)
+ {
+ return !request.isItemRequest();
+ }
+
+ @Override
+ public boolean isUsing(int objectId)
+ {
+ return (objectId > 0) && ((objectId == _appearanceStone.getObjectId()) || (objectId == _appearanceExtractItem.getObjectId()));
+ }
+}
diff --git a/trunk/java/com/l2jserver/gameserver/model/entity/AppearanceStone.java b/trunk/java/com/l2jserver/gameserver/model/entity/AppearanceStone.java
deleted file mode 100644
index 043b66574b..0000000000
--- a/trunk/java/com/l2jserver/gameserver/model/entity/AppearanceStone.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2004-2015 L2J Server
- *
- * This file is part of L2J Server.
- *
- * L2J Server is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package com.l2jserver.gameserver.model.entity;
-
-import java.util.ArrayList;
-
-/**
- * @author Erlandys
- */
-public class AppearanceStone
-{
- public enum StoneType
- {
- NONE,
- NORMAL,
- BLESSED,
- FIXED,
- RESTORE
- }
-
- public enum AppearanceItemType
- {
- NONE,
- WEAPON,
- ARMOR,
- ACCESSORY,
- ALL
- }
-
- private final int _itemId;
- private final StoneType _type;
- private final AppearanceItemType _itemType;
- private final ArrayList _grades;
- private final long _price;
- private final int _targetItem;
- private final long _timeForAppearance;
- private int _maxGrade;
-
- public AppearanceStone(int itemId, StoneType type, AppearanceItemType itemType, ArrayList grades, long price, int targetItem, long timeForAppearance)
- {
- _itemId = itemId;
- _type = type;
- _itemType = itemType;
- _grades = grades;
- _maxGrade = grades.get(0);
- for (int gr : _grades)
- {
- if (_maxGrade < gr)
- {
- _maxGrade = gr;
- }
- }
- _price = price;
- _targetItem = targetItem;
- _timeForAppearance = timeForAppearance;
- }
-
- public int getItemId()
- {
- return _itemId;
- }
-
- public StoneType getType()
- {
- return _type;
- }
-
- public AppearanceItemType getItemType()
- {
- return _itemType;
- }
-
- public ArrayList getGrades()
- {
- return _grades;
- }
-
- public int getMaxGrade()
- {
- return _maxGrade;
- }
-
- public long getPrice()
- {
- return _price;
- }
-
- public int getTargetItem()
- {
- return _targetItem;
- }
-
- public long getTimeForAppearance()
- {
- return _timeForAppearance;
- }
-}
diff --git a/trunk/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java b/trunk/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java
index 40df488bac..407cd92e6d 100644
--- a/trunk/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java
+++ b/trunk/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java
@@ -358,6 +358,7 @@ public abstract class Inventory extends ItemContainer
if (itemSkill != null)
{
+ itemSkill.setReferenceItemId(item.getId());
player.addSkill(itemSkill, false);
if (itemSkill.isActive())
@@ -454,7 +455,6 @@ public abstract class Inventory extends ItemContainer
if (itemSkill != null)
{
- itemSkill.setReferenceItemId(item.getId());
player.addSkill(itemSkill, false);
if (itemSkill.isActive())
@@ -644,6 +644,16 @@ public abstract class Inventory extends ItemContainer
}
}
+ final L2ArmorSet visualArmorSet = ArmorSetsData.getInstance().getSet(chestItem.getVisualId());
+ if ((visualArmorSet != null) && visualArmorSet.isVisual())
+ {
+ int pieces = visualArmorSet.getVisualPiecesCount(player);
+ if (pieces >= visualArmorSet.getMinimumPieces())
+ {
+ addSkills(player, item, visualArmorSet.getSkills(), visualArmorSet.getPiecesCount(player));
+ }
+ }
+
if (update)
{
player.sendSkillList();
@@ -687,6 +697,11 @@ public abstract class Inventory extends ItemContainer
{
remove = true;
}
+
+ if (removeArmorsetBonus(player, ArmorSetsData.getInstance().getSet(item.getVisualId())))
+ {
+ remove = true;
+ }
}
else
{
@@ -697,7 +712,7 @@ public abstract class Inventory extends ItemContainer
}
final L2ArmorSet armorSet = ArmorSetsData.getInstance().getSet(chestItem.getId());
- if (armorSet != null)
+ if ((armorSet != null) && !armorSet.isVisual())
{
if (armorSet.containItem(slot, item.getId())) // removed part of set
{
@@ -720,6 +735,25 @@ public abstract class Inventory extends ItemContainer
}
}
}
+
+ final L2ArmorSet visualArmorSet = ArmorSetsData.getInstance().getSet(chestItem.getVisualId());
+ if ((visualArmorSet != null) && visualArmorSet.isVisual())
+ {
+ if (visualArmorSet.containItem(slot, item.getVisualId())) // removed part of set
+ {
+ if (removeArmorsetBonus(player, visualArmorSet))
+ {
+ remove = true;
+ }
+ }
+ else if (visualArmorSet.containShield(item.getVisualId())) // removed shield
+ {
+ if (removeShieldSkills(player, visualArmorSet.getShieldSkills()))
+ {
+ remove = true;
+ }
+ }
+ }
}
if (remove)
@@ -1788,7 +1822,7 @@ public abstract class Inventory extends ItemContainer
public void restore()
{
try (Connection con = L2DatabaseFactory.getInstance().getConnection();
- PreparedStatement statement = con.prepareStatement("SELECT object_id, item_id, count, enchant_level, loc, loc_data, custom_type1, custom_type2, mana_left, time, appearance_id, appearance_time FROM items WHERE owner_id=? AND (loc=? OR loc=?) ORDER BY loc_data"))
+ PreparedStatement statement = con.prepareStatement("SELECT object_id, item_id, count, enchant_level, loc, loc_data, custom_type1, custom_type2, mana_left, time FROM items WHERE owner_id=? AND (loc=? OR loc=?) ORDER BY loc_data"))
{
statement.setInt(1, getOwnerId());
statement.setString(2, getBaseLocation().name());
diff --git a/trunk/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java b/trunk/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java
index cc65917699..92f2f10618 100644
--- a/trunk/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java
+++ b/trunk/java/com/l2jserver/gameserver/model/itemcontainer/PcInventory.java
@@ -40,6 +40,7 @@ import com.l2jserver.gameserver.model.events.impl.character.player.inventory.OnP
import com.l2jserver.gameserver.model.events.impl.character.player.inventory.OnPlayerItemTransfer;
import com.l2jserver.gameserver.model.items.L2Item;
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
+import com.l2jserver.gameserver.model.variables.ItemVariables;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.ExAdenaInvenCount;
import com.l2jserver.gameserver.network.serverpackets.ExUserInfoInvenWeight;
@@ -880,7 +881,7 @@ public class PcInventory extends Inventory
{
int[][] paperdoll = new int[33][4];
try (Connection con = L2DatabaseFactory.getInstance().getConnection();
- PreparedStatement statement2 = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level,appearance_id FROM items WHERE owner_id=? AND loc='PAPERDOLL'"))
+ PreparedStatement statement2 = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'"))
{
statement2.setInt(1, objectId);
try (ResultSet invdata = statement2.executeQuery())
@@ -888,13 +889,11 @@ public class PcInventory extends Inventory
while (invdata.next())
{
int slot = invdata.getInt("loc_data");
+ final ItemVariables vars = new ItemVariables(invdata.getInt("object_id"));
paperdoll[slot][0] = invdata.getInt("object_id");
paperdoll[slot][1] = invdata.getInt("item_id");
paperdoll[slot][2] = invdata.getInt("enchant_level");
- paperdoll[slot][3] = invdata.getInt("appearance_id");
- /*
- * if (slot == Inventory.PAPERDOLL_RHAND) { paperdoll[Inventory.PAPERDOLL_RHAND][0] = invdata.getInt("object_id"); paperdoll[Inventory.PAPERDOLL_RHAND][1] = invdata.getInt("item_id"); paperdoll[Inventory.PAPERDOLL_RHAND][2] = invdata.getInt("enchant_level"); }
- */
+ paperdoll[slot][3] = vars.getInt(ItemVariables.VISUAL_ID, 0);
}
}
}
diff --git a/trunk/java/com/l2jserver/gameserver/model/items/L2Armor.java b/trunk/java/com/l2jserver/gameserver/model/items/L2Armor.java
index 3891319904..a7c48aecc2 100644
--- a/trunk/java/com/l2jserver/gameserver/model/items/L2Armor.java
+++ b/trunk/java/com/l2jserver/gameserver/model/items/L2Armor.java
@@ -19,7 +19,6 @@
package com.l2jserver.gameserver.model.items;
import com.l2jserver.gameserver.model.StatsSet;
-import com.l2jserver.gameserver.model.entity.AppearanceStone;
import com.l2jserver.gameserver.model.holders.SkillHolder;
import com.l2jserver.gameserver.model.items.type.ArmorType;
import com.l2jserver.gameserver.model.skills.Skill;
@@ -118,10 +117,4 @@ public final class L2Armor extends L2Item
}
return _enchant4Skill.getSkill();
}
-
- @Override
- public AppearanceStone getAppearanceStone()
- {
- return null;
- }
}
diff --git a/trunk/java/com/l2jserver/gameserver/model/items/L2EtcItem.java b/trunk/java/com/l2jserver/gameserver/model/items/L2EtcItem.java
index 0957e76e6d..c5aa4ddfcc 100644
--- a/trunk/java/com/l2jserver/gameserver/model/items/L2EtcItem.java
+++ b/trunk/java/com/l2jserver/gameserver/model/items/L2EtcItem.java
@@ -21,10 +21,8 @@ package com.l2jserver.gameserver.model.items;
import java.util.ArrayList;
import java.util.List;
-import com.l2jserver.gameserver.data.xml.impl.AppearanceItemData;
import com.l2jserver.gameserver.model.L2ExtractableProduct;
import com.l2jserver.gameserver.model.StatsSet;
-import com.l2jserver.gameserver.model.entity.AppearanceStone;
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
import com.l2jserver.gameserver.model.items.type.EtcItemType;
import com.l2jserver.util.StringUtil;
@@ -39,7 +37,6 @@ public final class L2EtcItem extends L2Item
private final boolean _isBlessed;
private final List _extractableItems;
private final boolean _isInfinite;
- private final AppearanceStone _appearanceStone;
/**
* Constructor for EtcItem.
@@ -123,7 +120,6 @@ public final class L2EtcItem extends L2Item
}
_isInfinite = set.getBoolean("is_infinite", false);
- _appearanceStone = (_handler != null) && _handler.equals("Appearance") ? AppearanceItemData.getInstance().getStone(getId()) : null;
}
/**
@@ -175,10 +171,4 @@ public final class L2EtcItem extends L2Item
{
return _isInfinite;
}
-
- @Override
- public AppearanceStone getAppearanceStone()
- {
- return _appearanceStone;
- }
}
diff --git a/trunk/java/com/l2jserver/gameserver/model/items/L2Item.java b/trunk/java/com/l2jserver/gameserver/model/items/L2Item.java
index acdb250c17..8f7cdfca82 100644
--- a/trunk/java/com/l2jserver/gameserver/model/items/L2Item.java
+++ b/trunk/java/com/l2jserver/gameserver/model/items/L2Item.java
@@ -35,7 +35,6 @@ import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Summon;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.conditions.Condition;
-import com.l2jserver.gameserver.model.entity.AppearanceStone;
import com.l2jserver.gameserver.model.events.ListenersContainer;
import com.l2jserver.gameserver.model.holders.SkillHolder;
import com.l2jserver.gameserver.model.interfaces.IIdentifiable;
@@ -964,6 +963,4 @@ public abstract class L2Item extends ListenersContainer implements IIdentifiable
{
return null;
}
-
- public abstract AppearanceStone getAppearanceStone();
}
diff --git a/trunk/java/com/l2jserver/gameserver/model/items/L2WarehouseItem.java b/trunk/java/com/l2jserver/gameserver/model/items/L2WarehouseItem.java
index 2b94530a3b..6b767d447f 100644
--- a/trunk/java/com/l2jserver/gameserver/model/items/L2WarehouseItem.java
+++ b/trunk/java/com/l2jserver/gameserver/model/items/L2WarehouseItem.java
@@ -64,9 +64,6 @@ public class L2WarehouseItem
private final int _time;
- private final int _appearanceId;
- private final long _appearanceTime;
-
public L2WarehouseItem(L2ItemInstance item)
{
_item = item.getItem();
@@ -97,8 +94,6 @@ public class L2WarehouseItem
_elemDefAttr[i] = item.getElementDefAttr(i);
}
_enchantOptions = item.getEnchantOptions();
- _appearanceId = item.getVisualId();
- _appearanceTime = item.getAppearanceTime();
}
/**
@@ -301,14 +296,4 @@ public class L2WarehouseItem
{
return _item.toString();
}
-
- public int getAppearanceId()
- {
- return _appearanceId;
- }
-
- public long getAppearanceTime()
- {
- return _appearanceTime;
- }
}
diff --git a/trunk/java/com/l2jserver/gameserver/model/items/L2Weapon.java b/trunk/java/com/l2jserver/gameserver/model/items/L2Weapon.java
index 0508e2a2ed..5bc89e1f97 100644
--- a/trunk/java/com/l2jserver/gameserver/model/items/L2Weapon.java
+++ b/trunk/java/com/l2jserver/gameserver/model/items/L2Weapon.java
@@ -26,7 +26,6 @@ import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.conditions.Condition;
import com.l2jserver.gameserver.model.conditions.ConditionGameChance;
-import com.l2jserver.gameserver.model.entity.AppearanceStone;
import com.l2jserver.gameserver.model.events.EventDispatcher;
import com.l2jserver.gameserver.model.events.impl.character.npc.OnNpcSkillSee;
import com.l2jserver.gameserver.model.holders.SkillHolder;
@@ -450,10 +449,4 @@ public final class L2Weapon extends L2Item
caster.sendPacket(sm);
}
}
-
- @Override
- public AppearanceStone getAppearanceStone()
- {
- return null;
- }
}
diff --git a/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceHandType.java b/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceHandType.java
new file mode 100644
index 0000000000..ad4474991c
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceHandType.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.model.items.appearance;
+
+/**
+ * @author UnAfraid
+ */
+public enum AppearanceHandType
+{
+ NONE,
+ ONE_HANDED,
+ TWO_HANDED,
+}
diff --git a/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceMagicType.java b/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceMagicType.java
new file mode 100644
index 0000000000..fa0826661a
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceMagicType.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.model.items.appearance;
+
+/**
+ * @author UnAfraid
+ */
+public enum AppearanceMagicType
+{
+ NONE,
+ MAGICAL,
+ PHYISICAL,
+}
diff --git a/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceStone.java b/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceStone.java
new file mode 100644
index 0000000000..849a41707d
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceStone.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.model.items.appearance;
+
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import com.l2jserver.gameserver.datatables.ItemTable;
+import com.l2jserver.gameserver.enums.Race;
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.items.L2Item;
+import com.l2jserver.gameserver.model.items.type.ArmorType;
+import com.l2jserver.gameserver.model.items.type.CrystalType;
+import com.l2jserver.gameserver.model.items.type.WeaponType;
+
+/**
+ * @author UnAfraid
+ */
+public class AppearanceStone
+{
+ private final int _id;
+ private final int _cost;
+ private final int _visualId;
+ private final long _lifeTime;
+ private final AppearanceType _type;
+ private final WeaponType _weaponType;
+ private final ArmorType _armorType;
+ private final AppearanceHandType _handType;
+ private final AppearanceMagicType _magicType;
+ private List _crystalTypes;
+ private List _targetTypes;
+ private List _bodyParts;
+ private List _races;
+ private List _racesNot;
+
+ public AppearanceStone(StatsSet set)
+ {
+ _id = set.getInt("id");
+ _visualId = set.getInt("visualId", 0);
+ _cost = set.getInt("cost", 0);
+ _lifeTime = set.getDuration("lifeTime", Duration.ofSeconds(0)).toMillis();
+ _type = set.getEnum("type", AppearanceType.class, AppearanceType.NONE);
+ _weaponType = set.getEnum("weaponType", WeaponType.class, WeaponType.NONE);
+ _armorType = set.getEnum("armorType", ArmorType.class, ArmorType.NONE);
+ _handType = set.getEnum("handType", AppearanceHandType.class, AppearanceHandType.NONE);
+ _magicType = set.getEnum("magicType", AppearanceMagicType.class, AppearanceMagicType.NONE);
+
+ final CrystalType crystalType = set.getEnum("crystalType", CrystalType.class, CrystalType.NONE);
+ if (crystalType != CrystalType.NONE)
+ {
+ addCrystalType(crystalType);
+ }
+ final AppearanceTargetType targetType = set.getEnum("targetType", AppearanceTargetType.class, AppearanceTargetType.NONE);
+ if (targetType != AppearanceTargetType.NONE)
+ {
+ addTargetType(targetType);
+ }
+
+ final int bodyPart = ItemTable._slots.get(set.getString("bodyPart", "none"));
+ if (bodyPart != L2Item.SLOT_NONE)
+ {
+ addBodyPart(bodyPart);
+ }
+
+ final Race race = set.getEnum("race", Race.class, Race.NONE);
+ if (race != Race.NONE)
+ {
+ addRace(race);
+ }
+
+ final Race raceNot = set.getEnum("raceNot", Race.class, Race.NONE);
+ if (raceNot != Race.NONE)
+ {
+ addRaceNot(raceNot);
+ }
+ }
+
+ public int getId()
+ {
+ return _id;
+ }
+
+ public int getVisualId()
+ {
+ return _visualId;
+ }
+
+ public int getCost()
+ {
+ return _cost;
+ }
+
+ public long getLifeTime()
+ {
+ return _lifeTime;
+ }
+
+ public AppearanceType getType()
+ {
+ return _type;
+ }
+
+ public WeaponType getWeaponType()
+ {
+ return _weaponType;
+ }
+
+ public ArmorType getArmorType()
+ {
+ return _armorType;
+ }
+
+ public AppearanceHandType getHandType()
+ {
+ return _handType;
+ }
+
+ public AppearanceMagicType getMagicType()
+ {
+ return _magicType;
+ }
+
+ public void addCrystalType(CrystalType type)
+ {
+ if (_crystalTypes == null)
+ {
+ _crystalTypes = new ArrayList<>();
+ }
+ _crystalTypes.add(type);
+ }
+
+ public List getCrystalTypes()
+ {
+ return _crystalTypes != null ? _crystalTypes : Collections.emptyList();
+ }
+
+ public void addTargetType(AppearanceTargetType type)
+ {
+ if (_targetTypes == null)
+ {
+ _targetTypes = new ArrayList<>();
+ }
+ _targetTypes.add(type);
+ }
+
+ public List getTargetTypes()
+ {
+ return _targetTypes != null ? _targetTypes : Collections.emptyList();
+ }
+
+ public void addBodyPart(Integer part)
+ {
+ if (_bodyParts == null)
+ {
+ _bodyParts = new ArrayList<>();
+ }
+ _bodyParts.add(part);
+ }
+
+ public List getBodyParts()
+ {
+ return _bodyParts != null ? _bodyParts : Collections.emptyList();
+ }
+
+ public void addRace(Race race)
+ {
+ if (_races == null)
+ {
+ _races = new ArrayList<>();
+ }
+ _races.add(race);
+ }
+
+ public List getRaces()
+ {
+ return _races != null ? _races : Collections.emptyList();
+ }
+
+ public void addRaceNot(Race race)
+ {
+ if (_racesNot == null)
+ {
+ _racesNot = new ArrayList<>();
+ }
+ _racesNot.add(race);
+ }
+
+ public List getRacesNot()
+ {
+ return _racesNot != null ? _racesNot : Collections.emptyList();
+ }
+}
diff --git a/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceTargetType.java b/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceTargetType.java
new file mode 100644
index 0000000000..6354622be8
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceTargetType.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.model.items.appearance;
+
+/**
+ * @author UnAfraid
+ */
+public enum AppearanceTargetType
+{
+ NONE,
+ WEAPON,
+ ARMOR,
+ ACCESSORY,
+ ALL
+}
diff --git a/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceType.java b/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceType.java
new file mode 100644
index 0000000000..0007112712
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/model/items/appearance/AppearanceType.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.model.items.appearance;
+
+/**
+ * @author UnAfraid
+ */
+public enum AppearanceType
+{
+ NONE,
+ NORMAL,
+ BLESSED,
+ FIXED,
+ RESTORE;
+}
diff --git a/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java b/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java
index 660306bf99..294fb648e0 100644
--- a/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java
+++ b/trunk/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java
@@ -37,12 +37,14 @@ import com.l2jserver.Config;
import com.l2jserver.L2DatabaseFactory;
import com.l2jserver.gameserver.GeoData;
import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.data.xml.impl.AppearanceItemData;
import com.l2jserver.gameserver.data.xml.impl.EnchantItemOptionsData;
import com.l2jserver.gameserver.data.xml.impl.OptionData;
import com.l2jserver.gameserver.datatables.ItemTable;
import com.l2jserver.gameserver.enums.InstanceType;
import com.l2jserver.gameserver.enums.ItemLocation;
import com.l2jserver.gameserver.enums.ShotType;
+import com.l2jserver.gameserver.enums.UserInfoType;
import com.l2jserver.gameserver.idfactory.IdFactory;
import com.l2jserver.gameserver.instancemanager.ItemsOnGroundManager;
import com.l2jserver.gameserver.instancemanager.MercTicketManager;
@@ -69,14 +71,17 @@ import com.l2jserver.gameserver.model.items.L2Armor;
import com.l2jserver.gameserver.model.items.L2EtcItem;
import com.l2jserver.gameserver.model.items.L2Item;
import com.l2jserver.gameserver.model.items.L2Weapon;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceStone;
import com.l2jserver.gameserver.model.items.type.EtcItemType;
import com.l2jserver.gameserver.model.items.type.ItemType;
import com.l2jserver.gameserver.model.options.EnchantOptions;
import com.l2jserver.gameserver.model.options.Options;
import com.l2jserver.gameserver.model.stats.functions.AbstractFunction;
+import com.l2jserver.gameserver.model.variables.ItemVariables;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.DropItem;
import com.l2jserver.gameserver.network.serverpackets.ExAdenaInvenCount;
+import com.l2jserver.gameserver.network.serverpackets.ExUserInfoEquipSlot;
import com.l2jserver.gameserver.network.serverpackets.ExUserInfoInvenWeight;
import com.l2jserver.gameserver.network.serverpackets.GetItem;
import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
@@ -163,6 +168,7 @@ public final class L2ItemInstance extends L2Object
private ScheduledFuture> itemLootShedule = null;
private ScheduledFuture> _lifeTimeTask;
+ private ScheduledFuture> _appearanceLifeTimeTask;
private final DropProtection _dropProtection = new DropProtection();
@@ -170,9 +176,6 @@ public final class L2ItemInstance extends L2Object
private final List _enchantOptions = new ArrayList<>();
- private int _appearanceId = 0;
- private long _appearanceTime = -1;
-
/**
* Constructor of the L2ItemInstance from the objectId and the itemId.
* @param objectId : int designating the ID of the object in the world
@@ -1502,8 +1505,8 @@ public final class L2ItemInstance extends L2Object
public static L2ItemInstance restoreFromDb(int ownerId, ResultSet rs)
{
L2ItemInstance inst = null;
- int objectId, item_id, loc_data, enchant_level, custom_type1, custom_type2, manaLeft, appearance_id;
- long time, count, appearance_time;
+ int objectId, item_id, loc_data, enchant_level, custom_type1, custom_type2, manaLeft;
+ long time, count;
ItemLocation loc;
try
{
@@ -1517,8 +1520,6 @@ public final class L2ItemInstance extends L2Object
custom_type2 = rs.getInt("custom_type2");
manaLeft = rs.getInt("mana_left");
time = rs.getLong("time");
- appearance_id = rs.getInt("appearance_id");
- appearance_time = rs.getLong("appearance_time");
}
catch (Exception e)
{
@@ -1545,8 +1546,6 @@ public final class L2ItemInstance extends L2Object
// Setup life time for shadow weapons
inst._mana = manaLeft;
inst._time = time;
- inst._appearanceId = appearance_id;
- inst._appearanceTime = appearance_time;
// load augmentation and elemental enchant
if (inst.isEquipable())
@@ -1665,7 +1664,7 @@ public final class L2ItemInstance extends L2Object
}
try (Connection con = L2DatabaseFactory.getInstance().getConnection();
- PreparedStatement ps = con.prepareStatement("UPDATE items SET owner_id=?,count=?,loc=?,loc_data=?,enchant_level=?,custom_type1=?,custom_type2=?,mana_left=?,time=?,appearance_id=?,appearance_time=? " + "WHERE object_id = ?"))
+ PreparedStatement ps = con.prepareStatement("UPDATE items SET owner_id=?,count=?,loc=?,loc_data=?,enchant_level=?,custom_type1=?,custom_type2=?,mana_left=?,time=? " + "WHERE object_id = ?"))
{
ps.setInt(1, _ownerId);
ps.setLong(2, getCount());
@@ -1676,9 +1675,7 @@ public final class L2ItemInstance extends L2Object
ps.setInt(7, getCustomType2());
ps.setInt(8, getMana());
ps.setLong(9, getTime());
- ps.setInt(10, getVisualId());
- ps.setLong(11, getAppearanceTime());
- ps.setInt(12, getObjectId());
+ ps.setInt(10, getObjectId());
ps.executeUpdate();
_existsInDb = true;
_storedInDb = true;
@@ -2260,27 +2257,101 @@ public final class L2ItemInstance extends L2Object
_lifeTimeTask.cancel(false);
_lifeTimeTask = null;
}
+
+ if ((_appearanceLifeTimeTask != null) && !_appearanceLifeTimeTask.isDone())
+ {
+ _appearanceLifeTimeTask.cancel(false);
+ _appearanceLifeTimeTask = null;
+ }
+ }
+
+ public final ItemVariables getVariables()
+ {
+ final ItemVariables vars = getScript(ItemVariables.class);
+ return vars != null ? vars : addScript(new ItemVariables(getObjectId()));
}
public int getVisualId()
{
- return _appearanceId;
+ final int visualId = getVariables().getInt(ItemVariables.VISUAL_ID, 0);
+ if (visualId > 0)
+ {
+ final int appearanceStoneId = getVariables().getInt(ItemVariables.VISUAL_APPEARANCE_STONE_ID, 0);
+ if (appearanceStoneId > 0)
+ {
+ final AppearanceStone stone = AppearanceItemData.getInstance().getStone(appearanceStoneId);
+ if (stone != null)
+ {
+ final L2PcInstance player = getActingPlayer();
+ if (player != null)
+ {
+ if (!stone.getRaces().isEmpty() && !stone.getRaces().contains(player.getRace()))
+ {
+ return 0;
+ }
+ if (!stone.getRacesNot().isEmpty() && stone.getRacesNot().contains(player.getRace()))
+ {
+ return 0;
+ }
+ }
+ }
+ }
+ }
+ return visualId;
}
- public void setAppearanceId(int appearanceId)
+ public void setVisualId(int visualId)
{
- _storedInDb = false;
- _appearanceId = appearanceId;
+ getVariables().set(ItemVariables.VISUAL_ID, visualId);
}
- public long getAppearanceTime()
+ public long getVisualLifeTime()
{
- _storedInDb = false;
- return _appearanceTime;
+ return getVariables().getLong(ItemVariables.VISUAL_APPEARANCE_LIFE_TIME, 0);
}
- public void setAppearanceTime(long appearanceTime)
+ public void scheduleVisualLifeTime()
{
- _appearanceTime = appearanceTime;
+ if (_appearanceLifeTimeTask != null)
+ {
+ _appearanceLifeTimeTask.cancel(false);
+ }
+ if (getVisualLifeTime() > 0)
+ {
+ final long time = getVisualLifeTime() - System.currentTimeMillis();
+ if (time > 0)
+ {
+ _appearanceLifeTimeTask = ThreadPoolManager.getInstance().scheduleGeneral(this::onVisualLifeTimeEnd, time);
+ }
+ else
+ {
+ ThreadPoolManager.getInstance().executeGeneral(this::onVisualLifeTimeEnd);
+ }
+ }
+ }
+
+ private final void onVisualLifeTimeEnd()
+ {
+ final ItemVariables vars = getVariables();
+ vars.remove(ItemVariables.VISUAL_ID);
+ vars.remove(ItemVariables.VISUAL_APPEARANCE_STONE_ID);
+ vars.remove(ItemVariables.VISUAL_APPEARANCE_LIFE_TIME);
+ vars.storeMe();
+
+ final L2PcInstance player = getActingPlayer();
+ if (player != null)
+ {
+ final InventoryUpdate iu = new InventoryUpdate();
+ iu.addModifiedItem(this);
+ player.broadcastUserInfo(UserInfoType.APPAREANCE);
+ player.sendPacket(new ExUserInfoEquipSlot(player));
+ player.sendPacket(iu);
+ player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_HAS_BEEN_RESTORED_TO_ITS_PREVIOUS_APPEARANCE_AS_ITS_TEMPORARY_MODIFICATION_HAS_EXPIRED).addItemName(this));
+ }
+ }
+
+ public boolean isAppearanceable()
+ {
+ return isWeapon() || isArmor();
}
}
diff --git a/trunk/java/com/l2jserver/gameserver/model/variables/ItemVariables.java b/trunk/java/com/l2jserver/gameserver/model/variables/ItemVariables.java
new file mode 100644
index 0000000000..4a460e200b
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/model/variables/ItemVariables.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2004-2015 L2J DataPack
+ *
+ * This file is part of L2J DataPack.
+ *
+ * L2J DataPack is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J DataPack is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.model.variables;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Map.Entry;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.l2jserver.L2DatabaseFactory;
+
+/**
+ * @author UnAfraid
+ */
+public class ItemVariables extends AbstractVariables
+{
+ private static final Logger _log = Logger.getLogger(ItemVariables.class.getName());
+
+ // SQL Queries.
+ private static final String SELECT_QUERY = "SELECT * FROM item_variables WHERE id = ?";
+ private static final String SELECT_COUNT = "SELECT COUNT(*) FROM item_variables WHERE id = ?";
+ private static final String DELETE_QUERY = "DELETE FROM item_variables WHERE id = ?";
+ private static final String INSERT_QUERY = "INSERT INTO item_variables (id, var, val) VALUES (?, ?, ?)";
+
+ private final int _objectId;
+
+ // Static Constants
+ public static final String VISUAL_ID = "visualId";
+ public static final String VISUAL_APPEARANCE_STONE_ID = "visualAppearanceStoneId";
+ public static final String VISUAL_APPEARANCE_LIFE_TIME = "visualAppearanceLifetime";
+
+ public ItemVariables(int objectId)
+ {
+ _objectId = objectId;
+ restoreMe();
+ }
+
+ public static boolean hasVariables(int objectId)
+ {
+ // Restore previous variables.
+ try (Connection con = L2DatabaseFactory.getInstance().getConnection();
+ PreparedStatement st = con.prepareStatement(SELECT_COUNT))
+ {
+ st.setInt(1, objectId);
+ try (ResultSet rset = st.executeQuery())
+ {
+ if (rset.next())
+ {
+ return rset.getInt(1) > 0;
+ }
+ }
+ }
+ catch (SQLException e)
+ {
+ _log.log(Level.WARNING, ItemVariables.class.getSimpleName() + ": Couldn't select variables count for: " + objectId, e);
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean restoreMe()
+ {
+ // Restore previous variables.
+ try (Connection con = L2DatabaseFactory.getInstance().getConnection();
+ PreparedStatement st = con.prepareStatement(SELECT_QUERY))
+ {
+ st.setInt(1, _objectId);
+ try (ResultSet rset = st.executeQuery())
+ {
+ while (rset.next())
+ {
+ set(rset.getString("var"), rset.getString("val"), false);
+ }
+ }
+ }
+ catch (SQLException e)
+ {
+ _log.log(Level.WARNING, getClass().getSimpleName() + ": Couldn't restore variables for: " + _objectId, e);
+ return false;
+ }
+ finally
+ {
+ compareAndSetChanges(true, false);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean storeMe()
+ {
+ // No changes, nothing to store.
+ if (!hasChanges())
+ {
+ return false;
+ }
+
+ try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+ {
+ // Clear previous entries.
+ try (PreparedStatement st = con.prepareStatement(DELETE_QUERY))
+ {
+ st.setInt(1, _objectId);
+ st.execute();
+ }
+
+ // Insert all variables.
+ try (PreparedStatement st = con.prepareStatement(INSERT_QUERY))
+ {
+ st.setInt(1, _objectId);
+ for (Entry entry : getSet().entrySet())
+ {
+ st.setString(2, entry.getKey());
+ st.setString(3, String.valueOf(entry.getValue()));
+ st.addBatch();
+ }
+ st.executeBatch();
+ }
+ }
+ catch (SQLException e)
+ {
+ _log.log(Level.WARNING, getClass().getSimpleName() + ": Couldn't update variables for: " + _objectId, e);
+ return false;
+ }
+ finally
+ {
+ compareAndSetChanges(true, false);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean deleteMe()
+ {
+ try (Connection con = L2DatabaseFactory.getInstance().getConnection())
+ {
+ // Clear previous entries.
+ try (PreparedStatement st = con.prepareStatement(DELETE_QUERY))
+ {
+ st.setInt(1, _objectId);
+ st.execute();
+ }
+
+ // Clear all entries
+ getSet().clear();
+ }
+ catch (Exception e)
+ {
+ _log.log(Level.WARNING, getClass().getSimpleName() + ": Couldn't delete variables for: " + _objectId, e);
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java b/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java
index 0b177a3545..9b5d22fbbf 100644
--- a/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java
+++ b/trunk/java/com/l2jserver/gameserver/network/L2GamePacketHandler.java
@@ -33,6 +33,10 @@ import com.l2jserver.gameserver.network.clientpackets.*;
import com.l2jserver.gameserver.network.clientpackets.adenadistribution.RequestDivideAdena;
import com.l2jserver.gameserver.network.clientpackets.adenadistribution.RequestDivideAdenaCancel;
import com.l2jserver.gameserver.network.clientpackets.adenadistribution.RequestDivideAdenaStart;
+import com.l2jserver.gameserver.network.clientpackets.appearance.RequestExCancelShape_Shifting_Item;
+import com.l2jserver.gameserver.network.clientpackets.appearance.RequestExTryToPutShapeShiftingEnchantSupportItem;
+import com.l2jserver.gameserver.network.clientpackets.appearance.RequestExTryToPutShapeShiftingTargetItem;
+import com.l2jserver.gameserver.network.clientpackets.appearance.RequestShapeShiftingItem;
import com.l2jserver.gameserver.network.clientpackets.auctionhouse.RequestCommissionBuyInfo;
import com.l2jserver.gameserver.network.clientpackets.auctionhouse.RequestCommissionBuyItem;
import com.l2jserver.gameserver.network.clientpackets.auctionhouse.RequestCommissionCancel;
@@ -57,10 +61,6 @@ import com.l2jserver.gameserver.network.clientpackets.friend.RequestFriendList;
import com.l2jserver.gameserver.network.clientpackets.friend.RequestSendFriendMsg;
import com.l2jserver.gameserver.network.clientpackets.friend.RequestUpdateBlockMemo;
import com.l2jserver.gameserver.network.clientpackets.friend.RequestUpdateFriendMemo;
-import com.l2jserver.gameserver.network.clientpackets.itemappearance.RequestExCancelShape_Shifting_Item;
-import com.l2jserver.gameserver.network.clientpackets.itemappearance.RequestExTryToPut_Shape_Shifting_EnchantSupportItem;
-import com.l2jserver.gameserver.network.clientpackets.itemappearance.RequestExTryToPut_Shape_Shifting_TargetItem;
-import com.l2jserver.gameserver.network.clientpackets.itemappearance.RequestShape_Shifting_Item;
import com.l2jserver.gameserver.network.clientpackets.mentoring.ConfirmMenteeAdd;
import com.l2jserver.gameserver.network.clientpackets.mentoring.RequestMenteeAdd;
import com.l2jserver.gameserver.network.clientpackets.mentoring.RequestMenteeWaitingList;
@@ -1487,16 +1487,16 @@ public final class L2GamePacketHandler implements IPacketHandler,
// msg = new ExSysstring(); (chdS)
break;
case 0xC4:
- msg = new RequestExTryToPut_Shape_Shifting_TargetItem();
+ msg = new RequestExTryToPutShapeShiftingTargetItem();
break;
case 0xC5:
- msg = new RequestExTryToPut_Shape_Shifting_EnchantSupportItem();
+ msg = new RequestExTryToPutShapeShiftingEnchantSupportItem();
break;
case 0xC6:
msg = new RequestExCancelShape_Shifting_Item();
break;
case 0xC7:
- msg = new RequestShape_Shifting_Item();
+ msg = new RequestShapeShiftingItem();
break;
case 0xC8:
// msg = new NCGuardSendDataToServer(); // (chdb)
diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestExCancelShape_Shifting_Item.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestExCancelShape_Shifting_Item.java
similarity index 64%
rename from trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestExCancelShape_Shifting_Item.java
rename to trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestExCancelShape_Shifting_Item.java
index ce663484d4..db8e240290 100644
--- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestExCancelShape_Shifting_Item.java
+++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestExCancelShape_Shifting_Item.java
@@ -16,15 +16,18 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.l2jserver.gameserver.network.clientpackets.itemappearance;
+package com.l2jserver.gameserver.network.clientpackets.appearance;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.actor.request.ShapeShiftingItemRequest;
import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket;
+import com.l2jserver.gameserver.network.serverpackets.appearance.ExShapeShiftingResult;
-public final class RequestExCancelShape_Shifting_Item extends L2GameClientPacket
+/**
+ * @author UnAfraid
+ */
+public class RequestExCancelShape_Shifting_Item extends L2GameClientPacket
{
- private static final String _C__D0_C6_REQUESTEXCANCELSHAPE_SHIFTING_ITEM = "[C] D0:C6 RequestExCancelShape_Shifting_Item";
-
@Override
protected void readImpl()
{
@@ -33,19 +36,19 @@ public final class RequestExCancelShape_Shifting_Item extends L2GameClientPacket
@Override
protected void runImpl()
{
- final L2PcInstance player = getClient().getActiveChar();
+ final L2PcInstance player = getActiveChar();
if (player == null)
{
return;
}
- player.setAppearanceItem(null);
- player.setTargetAppearanceItem(null);
- player.setUsingAppearanceStone(null);
+
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ player.sendPacket(ExShapeShiftingResult.FAILED);
}
@Override
public String getType()
{
- return _C__D0_C6_REQUESTEXCANCELSHAPE_SHIFTING_ITEM;
+ return getClass().getSimpleName();
}
}
diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestExTryToPutShapeShiftingEnchantSupportItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestExTryToPutShapeShiftingEnchantSupportItem.java
new file mode 100644
index 0000000000..943090d44d
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestExTryToPutShapeShiftingEnchantSupportItem.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.network.clientpackets.appearance;
+
+import com.l2jserver.gameserver.data.xml.impl.AppearanceItemData;
+import com.l2jserver.gameserver.enums.ItemLocation;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.actor.request.ShapeShiftingItemRequest;
+import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
+import com.l2jserver.gameserver.model.items.L2Item;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceStone;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceType;
+import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
+import com.l2jserver.gameserver.model.items.type.ArmorType;
+import com.l2jserver.gameserver.model.items.type.WeaponType;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket;
+import com.l2jserver.gameserver.network.serverpackets.appearance.ExPutShapeShiftingExtractionItemResult;
+import com.l2jserver.gameserver.network.serverpackets.appearance.ExShapeShiftingResult;
+
+/**
+ * @author UnAfraid
+ */
+public class RequestExTryToPutShapeShiftingEnchantSupportItem extends L2GameClientPacket
+{
+ private int _targetItemObjId;
+ private int _extracItemObjId;
+
+ @Override
+ protected void readImpl()
+ {
+ _targetItemObjId = readD();
+ _extracItemObjId = readD();
+ }
+
+ @Override
+ protected void runImpl()
+ {
+ final L2PcInstance player = getClient().getActiveChar();
+ if (player == null)
+ {
+ return;
+ }
+
+ final ShapeShiftingItemRequest request = player.getRequest(ShapeShiftingItemRequest.class);
+
+ if (player.isInStoreMode() || player.isInCraftMode() || player.isProcessingRequest() || player.isProcessingTransaction() || (request == null))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THIS_SYSTEM_DURING_TRADING_PRIVATE_STORE_AND_WORKSHOP_SETUP);
+ return;
+ }
+
+ final PcInventory inventory = player.getInventory();
+ final L2ItemInstance targetItem = inventory.getItemByObjectId(_targetItemObjId);
+ final L2ItemInstance extracItem = inventory.getItemByObjectId(_extracItemObjId);
+ L2ItemInstance stone = request.getAppearanceStone();
+ if ((targetItem == null) || (extracItem == null) || (stone == null))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (!extracItem.isAppearanceable())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if ((extracItem.getItemLocation() != ItemLocation.INVENTORY) && (extracItem.getItemLocation() != ItemLocation.PAPERDOLL))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if ((stone = inventory.getItemByObjectId(stone.getObjectId())) == null)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ final AppearanceStone appearanceStone = AppearanceItemData.getInstance().getStone(stone.getId());
+ if (appearanceStone == null)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if ((appearanceStone.getType() == AppearanceType.RESTORE) || (appearanceStone.getType() == AppearanceType.FIXED))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (extracItem.getVisualId() > 0)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.sendPacket(SystemMessageId.YOU_CANNOT_EXTRACT_FROM_A_MODIFIED_ITEM);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (appearanceStone.getWeaponType() != WeaponType.NONE)
+ {
+ if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ }
+
+ if (appearanceStone.getWeaponType() != WeaponType.NONE)
+ {
+ if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ switch (appearanceStone.getHandType())
+ {
+ case ONE_HANDED:
+ {
+ if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ break;
+ }
+ case TWO_HANDED:
+ {
+ if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ break;
+ }
+ }
+
+ switch (appearanceStone.getMagicType())
+ {
+ case MAGICAL:
+ {
+ if (!targetItem.getItem().isMagicWeapon())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ break;
+ }
+ case PHYISICAL:
+ {
+ if (targetItem.getItem().isMagicWeapon())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ }
+ }
+ }
+
+ if (appearanceStone.getArmorType() != ArmorType.NONE)
+ {
+ switch (appearanceStone.getArmorType())
+ {
+ case SHIELD:
+ {
+ if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ break;
+ }
+ case SIGIL:
+ {
+ if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ }
+ }
+ }
+
+ if (extracItem.getOwnerId() != player.getObjectId())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ request.setAppearanceExtractItem(extracItem);
+ player.sendPacket(ExPutShapeShiftingExtractionItemResult.SUCCESS);
+ }
+
+ @Override
+ public String getType()
+ {
+ return getClass().getSimpleName();
+ }
+}
diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestExTryToPutShapeShiftingTargetItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestExTryToPutShapeShiftingTargetItem.java
new file mode 100644
index 0000000000..916d76d309
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestExTryToPutShapeShiftingTargetItem.java
@@ -0,0 +1,268 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.network.clientpackets.appearance;
+
+import com.l2jserver.gameserver.data.xml.impl.AppearanceItemData;
+import com.l2jserver.gameserver.enums.ItemLocation;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.actor.request.ShapeShiftingItemRequest;
+import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
+import com.l2jserver.gameserver.model.items.L2Item;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceStone;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceTargetType;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceType;
+import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
+import com.l2jserver.gameserver.model.items.type.ArmorType;
+import com.l2jserver.gameserver.model.items.type.WeaponType;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket;
+import com.l2jserver.gameserver.network.serverpackets.appearance.ExPutShapeShiftingTargetItemResult;
+
+/**
+ * @author UnAfraid
+ */
+public class RequestExTryToPutShapeShiftingTargetItem extends L2GameClientPacket
+{
+ private int _targetItemObjId;
+
+ @Override
+ protected void readImpl()
+ {
+ _targetItemObjId = readD();
+ }
+
+ @Override
+ protected void runImpl()
+ {
+ final L2PcInstance player = getClient().getActiveChar();
+ if (player == null)
+ {
+ return;
+ }
+
+ final ShapeShiftingItemRequest request = player.getRequest(ShapeShiftingItemRequest.class);
+
+ if (player.isInStoreMode() || player.isInCraftMode() || player.isProcessingRequest() || player.isProcessingTransaction() || (request == null))
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THIS_SYSTEM_DURING_TRADING_PRIVATE_STORE_AND_WORKSHOP_SETUP);
+ return;
+ }
+
+ final PcInventory inventory = player.getInventory();
+ final L2ItemInstance targetItem = inventory.getItemByObjectId(_targetItemObjId);
+ L2ItemInstance stone = request.getAppearanceStone();
+
+ if ((targetItem == null) || (stone == null))
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (!targetItem.isAppearanceable())
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if ((targetItem.getItemLocation() != ItemLocation.INVENTORY) && (targetItem.getItemLocation() != ItemLocation.PAPERDOLL))
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if ((stone = inventory.getItemByObjectId(stone.getObjectId())) == null)
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ final AppearanceStone appearanceStone = AppearanceItemData.getInstance().getStone(stone.getId());
+ if (appearanceStone == null)
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (((appearanceStone.getType() != AppearanceType.RESTORE) && (targetItem.getVisualId() > 0)) || ((appearanceStone.getType() == AppearanceType.RESTORE) && (targetItem.getVisualId() == 0)))
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ // TODO: Handle hair accessory!
+ // if (!targetItem.isEtcItem() && (targetItem.getItem().getCrystalType() == CrystalType.NONE))
+ {
+ // player.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_OR_RESTORE_NOGRADE_ITEMS);
+ // return;
+ }
+
+ if (!appearanceStone.getCrystalTypes().isEmpty() && !appearanceStone.getCrystalTypes().contains(targetItem.getItem().getCrystalType()))
+ {
+ player.sendPacket(SystemMessageId.ITEM_GRADES_DO_NOT_MATCH);
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (appearanceStone.getTargetTypes().isEmpty())
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (!appearanceStone.getTargetTypes().contains(AppearanceTargetType.ALL))
+ {
+ if (targetItem.isWeapon() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.WEAPON))
+ {
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+
+ }
+ else if (targetItem.isArmor() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ARMOR) && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ACCESSORY))
+ {
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ else if (targetItem.isArmor() && !appearanceStone.getBodyParts().isEmpty() && !appearanceStone.getBodyParts().contains(targetItem.getItem().getBodyPart()))
+ {
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ }
+
+ if (appearanceStone.getWeaponType() != WeaponType.NONE)
+ {
+ if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ return;
+ }
+
+ switch (appearanceStone.getHandType())
+ {
+ case ONE_HANDED:
+ {
+ if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ return;
+ }
+ break;
+ }
+ case TWO_HANDED:
+ {
+ if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ return;
+ }
+ break;
+ }
+ }
+
+ switch (appearanceStone.getMagicType())
+ {
+ case MAGICAL:
+ {
+ if (!targetItem.getItem().isMagicWeapon())
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ return;
+ }
+ break;
+ }
+ case PHYISICAL:
+ {
+ if (targetItem.getItem().isMagicWeapon())
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ return;
+ }
+ }
+ }
+ }
+
+ if (appearanceStone.getArmorType() != ArmorType.NONE)
+ {
+ switch (appearanceStone.getArmorType())
+ {
+ case SHIELD:
+ {
+ if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ return;
+ }
+ break;
+ }
+ case SIGIL:
+ {
+ if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
+ return;
+ }
+ }
+ }
+ }
+
+ if (targetItem.getOwnerId() != player.getObjectId())
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ player.sendPacket(new ExPutShapeShiftingTargetItemResult(ExPutShapeShiftingTargetItemResult.RESULT_SUCCESS, appearanceStone.getCost()));
+ }
+
+ @Override
+ public String getType()
+ {
+ return getClass().getSimpleName();
+ }
+}
diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestShapeShiftingItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestShapeShiftingItem.java
new file mode 100644
index 0000000000..4971ca886d
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/network/clientpackets/appearance/RequestShapeShiftingItem.java
@@ -0,0 +1,416 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.network.clientpackets.appearance;
+
+import com.l2jserver.gameserver.data.xml.impl.AppearanceItemData;
+import com.l2jserver.gameserver.enums.InventorySlot;
+import com.l2jserver.gameserver.enums.ItemLocation;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.actor.request.ShapeShiftingItemRequest;
+import com.l2jserver.gameserver.model.itemcontainer.PcInventory;
+import com.l2jserver.gameserver.model.items.L2Item;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceStone;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceTargetType;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceType;
+import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
+import com.l2jserver.gameserver.model.items.type.ArmorType;
+import com.l2jserver.gameserver.model.items.type.WeaponType;
+import com.l2jserver.gameserver.model.variables.ItemVariables;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket;
+import com.l2jserver.gameserver.network.serverpackets.ExUserInfoEquipSlot;
+import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
+import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+import com.l2jserver.gameserver.network.serverpackets.appearance.ExPutShapeShiftingTargetItemResult;
+import com.l2jserver.gameserver.network.serverpackets.appearance.ExShapeShiftingResult;
+
+/**
+ * @author UnAfraid
+ */
+public class RequestShapeShiftingItem extends L2GameClientPacket
+{
+ private int _targetItemObjId;
+
+ @Override
+ protected void readImpl()
+ {
+ _targetItemObjId = readD();
+ }
+
+ @Override
+ protected void runImpl()
+ {
+ final L2PcInstance player = getClient().getActiveChar();
+ if (player == null)
+ {
+ return;
+ }
+
+ final ShapeShiftingItemRequest request = player.getRequest(ShapeShiftingItemRequest.class);
+
+ if (player.isInStoreMode() || player.isInCraftMode() || player.isProcessingRequest() || player.isProcessingTransaction() || (request == null))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.sendPacket(SystemMessageId.YOU_CANNOT_USE_THIS_SYSTEM_DURING_TRADING_PRIVATE_STORE_AND_WORKSHOP_SETUP);
+ return;
+ }
+
+ final PcInventory inventory = player.getInventory();
+ final L2ItemInstance targetItem = inventory.getItemByObjectId(_targetItemObjId);
+ L2ItemInstance stone = request.getAppearanceStone();
+
+ if ((targetItem == null) || (stone == null))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (stone.getOwnerId() != player.getObjectId())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (!targetItem.isAppearanceable())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if ((targetItem.getItemLocation() != ItemLocation.INVENTORY) && (targetItem.getItemLocation() != ItemLocation.PAPERDOLL))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if ((stone = inventory.getItemByObjectId(stone.getObjectId())) == null)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ final AppearanceStone appearanceStone = AppearanceItemData.getInstance().getStone(stone.getId());
+ if (appearanceStone == null)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (((appearanceStone.getType() != AppearanceType.RESTORE) && (targetItem.getVisualId() > 0)) || ((appearanceStone.getType() == AppearanceType.RESTORE) && (targetItem.getVisualId() == 0)))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ // TODO: Handle hair accessory!
+ // if (!targetItem.isEtcItem() && (targetItem.getItem().getCrystalType() == CrystalType.NONE))
+ {
+ // player.sendPacket(ExShapeShiftingResult.FAILED);
+ // player.removeRequest(ShapeShiftingItemRequest.class);
+ // return;
+ }
+
+ if (!appearanceStone.getCrystalTypes().isEmpty() && !appearanceStone.getCrystalTypes().contains(targetItem.getItem().getCrystalType()))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (appearanceStone.getTargetTypes().isEmpty())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (!appearanceStone.getTargetTypes().contains(AppearanceTargetType.ALL))
+ {
+ if (targetItem.isWeapon() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.WEAPON))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+
+ }
+ else if (targetItem.isArmor() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ARMOR) && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ACCESSORY))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ else if (targetItem.isArmor() && !appearanceStone.getBodyParts().isEmpty() && !appearanceStone.getBodyParts().contains(targetItem.getItem().getBodyPart()))
+ {
+ player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ }
+
+ if (appearanceStone.getWeaponType() != WeaponType.NONE)
+ {
+ if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ switch (appearanceStone.getHandType())
+ {
+ case ONE_HANDED:
+ {
+ if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ break;
+ }
+ case TWO_HANDED:
+ {
+ if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ break;
+ }
+ }
+
+ switch (appearanceStone.getMagicType())
+ {
+ case MAGICAL:
+ {
+ if (!targetItem.getItem().isMagicWeapon())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ break;
+ }
+ case PHYISICAL:
+ {
+ if (targetItem.getItem().isMagicWeapon())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ }
+ }
+ }
+
+ if (appearanceStone.getArmorType() != ArmorType.NONE)
+ {
+ switch (appearanceStone.getArmorType())
+ {
+ case SHIELD:
+ {
+ if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ break;
+ }
+ case SIGIL:
+ {
+ if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ }
+ }
+ }
+
+ final L2ItemInstance extracItem = request.getAppearanceExtractItem();
+
+ int extracItemId = 0;
+ if ((appearanceStone.getType() != AppearanceType.RESTORE) && (appearanceStone.getType() != AppearanceType.FIXED))
+ {
+ if (extracItem == null)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (!extracItem.isAppearanceable())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if ((extracItem.getItemLocation() != ItemLocation.INVENTORY) && (extracItem.getItemLocation() != ItemLocation.PAPERDOLL))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (!extracItem.isEtcItem() && (targetItem.getItem().getCrystalType().ordinal() <= extracItem.getItem().getCrystalType().ordinal()))
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (extracItem.getVisualId() > 0)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (extracItem.getOwnerId() != player.getObjectId())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ extracItemId = extracItem.getId();
+ }
+
+ if (targetItem.getOwnerId() != player.getObjectId())
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ long cost = appearanceStone.getCost();
+ if (cost > player.getAdena())
+ {
+ player.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_AS_YOU_DO_NOT_HAVE_ENOUGH_ADENA);
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+
+ if (stone.getCount() < 1L)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ if (appearanceStone.getType() == AppearanceType.NORMAL)
+ {
+ if (inventory.destroyItem(getClass().getSimpleName(), extracItem, 1, player, this) == null)
+ {
+ player.sendPacket(ExShapeShiftingResult.FAILED);
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ return;
+ }
+ }
+
+ inventory.destroyItem(getClass().getSimpleName(), stone, 1, player, this);
+ player.reduceAdena(getClass().getSimpleName(), cost, extracItem, true);
+
+ switch (appearanceStone.getType())
+ {
+ case RESTORE:
+ {
+ targetItem.setVisualId(0);
+ targetItem.getVariables().set(ItemVariables.VISUAL_APPEARANCE_STONE_ID, 0);
+ break;
+ }
+ case NORMAL:
+ {
+ targetItem.setVisualId(extracItem.getId());
+ break;
+ }
+ case BLESSED:
+ {
+ targetItem.setVisualId(extracItem.getId());
+ break;
+ }
+ case FIXED:
+ {
+ targetItem.setVisualId(appearanceStone.getVisualId());
+ targetItem.getVariables().set(ItemVariables.VISUAL_APPEARANCE_STONE_ID, appearanceStone.getId());
+ break;
+ }
+ }
+
+ if ((appearanceStone.getType() != AppearanceType.RESTORE) && (appearanceStone.getLifeTime() > 0))
+ {
+ targetItem.getVariables().set(ItemVariables.VISUAL_APPEARANCE_LIFE_TIME, System.currentTimeMillis() + appearanceStone.getLifeTime());
+ targetItem.scheduleVisualLifeTime();
+ }
+
+ targetItem.getVariables().storeMe();
+ if (appearanceStone.getCost() > 0)
+ {
+ player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_SPENT_S1_ON_A_SUCCESSFUL_APPEARANCE_MODIFICATION).addLong(cost));
+ }
+ else
+ {
+ player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_S_APPEARANCE_MODIFICATION_HAS_FINISHED).addItemName(targetItem.getDisplayId()));
+ }
+
+ final InventoryUpdate iu = new InventoryUpdate();
+ iu.addModifiedItem(targetItem);
+ if (inventory.getItemByObjectId(stone.getObjectId()) == null)
+ {
+ iu.addRemovedItem(stone);
+ }
+ else
+ {
+ iu.addModifiedItem(stone);
+ }
+ player.sendPacket(iu);
+
+ player.removeRequest(ShapeShiftingItemRequest.class);
+ player.sendPacket(new ExShapeShiftingResult(ExShapeShiftingResult.RESULT_SUCCESS, targetItem.getId(), extracItemId));
+ if (targetItem.isEquipped())
+ {
+ player.broadcastUserInfo();
+ final ExUserInfoEquipSlot slots = new ExUserInfoEquipSlot(player, false);
+ for (InventorySlot slot : InventorySlot.values())
+ {
+ if (slot.getSlot() == targetItem.getLocationSlot())
+ {
+ slots.addComponentType(slot);
+ }
+ }
+ player.sendPacket(slots);
+ }
+ }
+
+ @Override
+ public String getType()
+ {
+ return getClass().getSimpleName();
+ }
+}
diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestExTryToPut_Shape_Shifting_EnchantSupportItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestExTryToPut_Shape_Shifting_EnchantSupportItem.java
deleted file mode 100644
index c746a33d5f..0000000000
--- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestExTryToPut_Shape_Shifting_EnchantSupportItem.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2004-2015 L2J Server
- *
- * This file is part of L2J Server.
- *
- * L2J Server is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package com.l2jserver.gameserver.network.clientpackets.itemappearance;
-
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
-import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket;
-import com.l2jserver.gameserver.network.serverpackets.itemappearance.ExPut_Shape_Shifting_Extraction_Item_Result;
-import com.l2jserver.gameserver.network.serverpackets.itemappearance.ExPut_Shape_Shifting_Target_Item_Result;
-
-public final class RequestExTryToPut_Shape_Shifting_EnchantSupportItem extends L2GameClientPacket
-{
- private static final String _C__D0_C5_REQUESTEXTRYTOPUT_SHAPE_SHIFTING_ENCHANTSUPPORTITEM = "[C] D0:C5 RequestExTryToPut_Shape_Shifting_EnchantSupportItem";
-
- private int _itemOID;
-
- @Override
- protected void readImpl()
- {
- readD();
- _itemOID = readD();
- }
-
- @Override
- protected void runImpl()
- {
- final L2PcInstance player = getClient().getActiveChar();
- if (player == null)
- {
- return;
- }
-
- final L2ItemInstance stone = player.getUsingAppearanceStone();
- if ((stone == null) || (stone.getEtcItem().getAppearanceStone() == null))
- {
- player.sendPacket(new ExPut_Shape_Shifting_Target_Item_Result(0));
- return;
- }
- final L2ItemInstance targetItem = player.getInventory().getItemByObjectId(_itemOID);
- if (targetItem == null)
- {
- player.sendPacket(new ExPut_Shape_Shifting_Target_Item_Result(0));
- return;
- }
- if (stone.getEtcItem().getAppearanceStone().getGrades().contains(targetItem.getItem().getCrystalType().getId()))
- {
- player.sendPacket(new ExPut_Shape_Shifting_Target_Item_Result(0));
- return;
- }
- final L2ItemInstance item = player.getAppearanceItem();
- if (item == null)
- {
- player.sendPacket(new ExPut_Shape_Shifting_Target_Item_Result(0));
- return;
- }
- if (!item.getItemType().equals(targetItem.getItemType()))
- {
- player.sendPacket(new ExPut_Shape_Shifting_Extraction_Item_Result(0));
- return;
- }
- if ((item.isWeapon() && (item.getWeaponItem().getItemType() != targetItem.getWeaponItem().getItemType())) || (item.isArmor() && (item.getArmorItem().getItemType() != targetItem.getArmorItem().getItemType())))
- {
- player.sendPacket(new ExPut_Shape_Shifting_Extraction_Item_Result(0));
- return;
- }
- player.sendPacket(new ExPut_Shape_Shifting_Target_Item_Result(1));
- player.setTargetAppearanceItem(targetItem);
- }
-
- @Override
- public String getType()
- {
- return _C__D0_C5_REQUESTEXTRYTOPUT_SHAPE_SHIFTING_ENCHANTSUPPORTITEM;
- }
-}
diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestExTryToPut_Shape_Shifting_TargetItem.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestExTryToPut_Shape_Shifting_TargetItem.java
deleted file mode 100644
index 177f3e5313..0000000000
--- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestExTryToPut_Shape_Shifting_TargetItem.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2004-2015 L2J Server
- *
- * This file is part of L2J Server.
- *
- * L2J Server is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package com.l2jserver.gameserver.network.clientpackets.itemappearance;
-
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.entity.AppearanceStone.AppearanceItemType;
-import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
-import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket;
-import com.l2jserver.gameserver.network.serverpackets.itemappearance.ExPut_Shape_Shifting_Extraction_Item_Result;
-
-public final class RequestExTryToPut_Shape_Shifting_TargetItem extends L2GameClientPacket
-{
- private static final String _C__D0_C4_REQUESTEXTRYTOPUT_SHAPE_SHIFTING_TARGETITEM = "[C] D0:C4 RequestExTryToPut_Shape_Shifting_TargetItem";
-
- private int _itemId;
-
- @Override
- protected void readImpl()
- {
- _itemId = readD();
- }
-
- @Override
- protected void runImpl()
- {
- final L2PcInstance player = getClient().getActiveChar();
- if (player == null)
- {
- return;
- }
- final L2ItemInstance item = player.getInventory().getItemByObjectId(_itemId);
- if (item == null)
- {
- return;
- }
- final L2ItemInstance stone = player.getUsingAppearanceStone();
- if ((stone == null) || (stone.getEtcItem().getAppearanceStone() == null))
- {
- return;
- }
-
- if (stone.getEtcItem().getAppearanceStone().getMaxGrade() < item.getItem().getCrystalType().getId())
- {
- player.sendPacket(new ExPut_Shape_Shifting_Extraction_Item_Result(0));
- return;
- }
- final boolean isSameType = ((stone.getEtcItem().getAppearanceStone().getItemType() == AppearanceItemType.ARMOR) && item.isArmor()) || ((stone.getEtcItem().getAppearanceStone().getItemType() == AppearanceItemType.WEAPON) && item.isWeapon()) || ((stone.getEtcItem().getAppearanceStone().getItemType() == AppearanceItemType.ACCESSORY) && item.isArmor()) || ((stone.getEtcItem().getAppearanceStone().getItemType() == AppearanceItemType.ALL));
- if (!isSameType)
- {
- player.sendPacket(new ExPut_Shape_Shifting_Extraction_Item_Result(0));
- return;
- }
- player.setAppearanceItem(item);
- player.sendPacket(new ExPut_Shape_Shifting_Extraction_Item_Result(1, stone.getEtcItem().getAppearanceStone().getPrice()));
- }
-
- @Override
- public String getType()
- {
- return _C__D0_C4_REQUESTEXTRYTOPUT_SHAPE_SHIFTING_TARGETITEM;
- }
-}
diff --git a/trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestShape_Shifting_Item.java b/trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestShape_Shifting_Item.java
deleted file mode 100644
index b394979ea8..0000000000
--- a/trunk/java/com/l2jserver/gameserver/network/clientpackets/itemappearance/RequestShape_Shifting_Item.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2004-2015 L2J Server
- *
- * This file is part of L2J Server.
- *
- * L2J Server is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package com.l2jserver.gameserver.network.clientpackets.itemappearance;
-
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.entity.AppearanceStone;
-import com.l2jserver.gameserver.model.entity.AppearanceStone.StoneType;
-import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
-import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.network.clientpackets.L2GameClientPacket;
-import com.l2jserver.gameserver.network.serverpackets.ExUserInfoEquipSlot;
-import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
-import com.l2jserver.gameserver.network.serverpackets.itemappearance.ExShape_Shifting_Result;
-
-public final class RequestShape_Shifting_Item extends L2GameClientPacket
-{
- private static final String _C__D0_C7_REQUESTSHAPE_SHIFTING_ITEM = "[C] D0:C7 RequestShape_Shifting_Item";
-
- @Override
- protected void readImpl()
- {
- readD();
- }
-
- @Override
- protected void runImpl()
- {
- final L2PcInstance player = getClient().getActiveChar();
- if (player == null)
- {
- return;
- }
- final L2ItemInstance stone = player.getUsingAppearanceStone();
- final L2ItemInstance item = player.getAppearanceItem();
- final L2ItemInstance targetItem = player.getTargetAppearanceItem();
- final boolean needTargetItem = (stone != null) && (stone.getEtcItem().getAppearanceStone() != null) && (stone.getEtcItem().getAppearanceStone().getType().equals(StoneType.BLESSED) || stone.getEtcItem().getAppearanceStone().getType().equals(StoneType.NORMAL)) ? true : false;
- player.setUsingAppearanceStone(null);
- player.setAppearanceItem(null);
- player.setTargetAppearanceItem(null);
- if ((stone == null) || (item == null) || ((needTargetItem && (targetItem == null))))
- {
- return;
- }
- final AppearanceStone st = stone.getEtcItem().getAppearanceStone();
- if (st == null)
- {
- return;
- }
- final long cost = st.getPrice();
- if (cost > player.getAdena())
- {
- player.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_AS_YOU_DO_NOT_HAVE_ENOUGH_ADENA);
- return;
- }
- int targetItemId = 0;
- int time = -1;
- switch (st.getType())
- {
- case NORMAL:
- targetItemId = targetItem.getId();
- player.destroyItem("AppearanceStone", targetItem, null, true);
- break;
- case BLESSED:
- targetItemId = targetItem.getId();
- break;
- case FIXED:
- targetItemId = st.getTargetItem();
- time = (int) st.getTimeForAppearance();
- break;
- default:
- break;
- }
- if (cost > 0)
- {
- player.reduceAdena("AppearanceStone", cost, null, true);
- }
- player.destroyItem("AppearanceStone", stone.getObjectId(), 1, null, true);
- item.setAppearanceId(targetItemId);
- item.setAppearanceTime(time);
- InventoryUpdate iu = new InventoryUpdate();
- iu.addModifiedItem(item);
- player.sendPacket(iu);
- player.sendPacket(new ExUserInfoEquipSlot(player));
- player.broadcastUserInfo();
- player.sendPacket(new ExShape_Shifting_Result(1, item.getId(), targetItemId, time));
- }
-
- @Override
- public String getType()
- {
- return _C__D0_C7_REQUESTSHAPE_SHIFTING_ITEM;
- }
-}
diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExChooseShapeShiftingItem.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExChooseShapeShiftingItem.java
new file mode 100644
index 0000000000..8c25cb5c46
--- /dev/null
+++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExChooseShapeShiftingItem.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2004-2015 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.l2jserver.gameserver.network.serverpackets.appearance;
+
+import com.l2jserver.gameserver.model.items.appearance.AppearanceStone;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceTargetType;
+import com.l2jserver.gameserver.model.items.appearance.AppearanceType;
+import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
+
+/**
+ * @author UnAfraid
+ */
+public class ExChooseShapeShiftingItem extends L2GameServerPacket
+{
+
+ private final AppearanceType _type;
+ private final AppearanceTargetType _targetType;
+ private final int _itemId;
+
+ public ExChooseShapeShiftingItem(AppearanceStone stone)
+ {
+ _type = stone.getType();
+ _targetType = stone.getTargetTypes().size() > 1 ? AppearanceTargetType.ALL : stone.getTargetTypes().get(0);
+ _itemId = stone.getId();
+ }
+
+ @Override
+ protected void writeImpl()
+ {
+ writeC(0xFE);
+ writeH(0x129);
+ writeD(_targetType != null ? _targetType.ordinal() : 0);
+ writeD(_type != null ? _type.ordinal() : 0);
+ writeD(_itemId);
+ }
+}
diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExPut_Shape_Shifting_Target_Item_Result.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExPutShapeShiftingExtractionItemResult.java
similarity index 61%
rename from trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExPut_Shape_Shifting_Target_Item_Result.java
rename to trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExPutShapeShiftingExtractionItemResult.java
index fedcd42695..3afcaba79a 100644
--- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExPut_Shape_Shifting_Target_Item_Result.java
+++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExPutShapeShiftingExtractionItemResult.java
@@ -16,20 +16,23 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.l2jserver.gameserver.network.serverpackets.itemappearance;
+package com.l2jserver.gameserver.network.serverpackets.appearance;
import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
/**
- * @author Erlandys
+ * @author UnAfraid
*/
-public class ExPut_Shape_Shifting_Target_Item_Result extends L2GameServerPacket
+public class ExPutShapeShiftingExtractionItemResult extends L2GameServerPacket
{
- private final int _success;
+ public static ExPutShapeShiftingExtractionItemResult FAILED = new ExPutShapeShiftingExtractionItemResult(0x00);
+ public static ExPutShapeShiftingExtractionItemResult SUCCESS = new ExPutShapeShiftingExtractionItemResult(0x01);
- public ExPut_Shape_Shifting_Target_Item_Result(int success)
+ private final int _result;
+
+ public ExPutShapeShiftingExtractionItemResult(int result)
{
- _success = success;
+ _result = result;
}
@Override
@@ -37,6 +40,6 @@ public class ExPut_Shape_Shifting_Target_Item_Result extends L2GameServerPacket
{
writeC(0xFE);
writeH(0x12B);
- writeD(_success);
+ writeD(_result);
}
-}
+}
\ No newline at end of file
diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExPut_Shape_Shifting_Extraction_Item_Result.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExPutShapeShiftingTargetItemResult.java
similarity index 61%
rename from trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExPut_Shape_Shifting_Extraction_Item_Result.java
rename to trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExPutShapeShiftingTargetItemResult.java
index 32f9fde677..7c2f8f8390 100644
--- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExPut_Shape_Shifting_Extraction_Item_Result.java
+++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExPutShapeShiftingTargetItemResult.java
@@ -16,26 +16,26 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.l2jserver.gameserver.network.serverpackets.itemappearance;
+package com.l2jserver.gameserver.network.serverpackets.appearance;
import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
/**
- * @author Erlandys
+ * @author UnAfraid
*/
-public class ExPut_Shape_Shifting_Extraction_Item_Result extends L2GameServerPacket
+public class ExPutShapeShiftingTargetItemResult extends L2GameServerPacket
{
- private final int _type;
- private long _price = 0;
+ public static int RESULT_FAILED = 0x00;
+ public static int RESULT_SUCCESS = 0x01;
- public ExPut_Shape_Shifting_Extraction_Item_Result(int type)
- {
- _type = type;
- }
+ public static ExPutShapeShiftingTargetItemResult FAILED = new ExPutShapeShiftingTargetItemResult(RESULT_FAILED, 0L);
- public ExPut_Shape_Shifting_Extraction_Item_Result(int type, long price)
+ private final int _resultId;
+ private final long _price;
+
+ public ExPutShapeShiftingTargetItemResult(int resultId, long price)
{
- _type = type;
+ _resultId = resultId;
_price = price;
}
@@ -44,7 +44,7 @@ public class ExPut_Shape_Shifting_Extraction_Item_Result extends L2GameServerPac
{
writeC(0xFE);
writeH(0x12A);
- writeD(_type);
+ writeD(_resultId);
writeQ(_price);
}
-}
+}
\ No newline at end of file
diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExChoose_Shape_Shifting_Item.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExShapeShiftingResult.java
similarity index 54%
rename from trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExChoose_Shape_Shifting_Item.java
rename to trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExShapeShiftingResult.java
index 202ef77793..9020996a30 100644
--- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExChoose_Shape_Shifting_Item.java
+++ b/trunk/java/com/l2jserver/gameserver/network/serverpackets/appearance/ExShapeShiftingResult.java
@@ -16,34 +16,38 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package com.l2jserver.gameserver.network.serverpackets.itemappearance;
+package com.l2jserver.gameserver.network.serverpackets.appearance;
-import com.l2jserver.gameserver.model.entity.AppearanceStone;
import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
/**
- * @author Erlandys
+ * @author UnAfraid
*/
-public class ExChoose_Shape_Shifting_Item extends L2GameServerPacket
+public class ExShapeShiftingResult extends L2GameServerPacket
{
- private final int _itemId;
- private final int _type;
- private final int _itemType;
+ public static int RESULT_FAILED = 0x00;
+ public static int RESULT_SUCCESS = 0x01;
- public ExChoose_Shape_Shifting_Item(AppearanceStone stone)
+ public static ExShapeShiftingResult FAILED = new ExShapeShiftingResult(RESULT_FAILED, 0, 0);
+
+ private final int _result;
+ private final int _targetItemId;
+ private final int _extractItemId;
+
+ public ExShapeShiftingResult(int result, int targetItemId, int extractItemId)
{
- _itemId = stone.getItemId();
- _type = stone.getType().ordinal();
- _itemType = stone.getItemType().ordinal();
+ _result = result;
+ _targetItemId = targetItemId;
+ _extractItemId = extractItemId;
}
@Override
protected void writeImpl()
{
writeC(0xFE);
- writeH(0x129);
- writeD(_type);
- writeD(_itemType);
- writeD(_itemId);
+ writeH(0x12C);
+ writeD(_result);
+ writeD(_targetItemId);
+ writeD(_extractItemId);
}
}
diff --git a/trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExShape_Shifting_Result.java b/trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExShape_Shifting_Result.java
deleted file mode 100644
index 9f78a4aeb7..0000000000
--- a/trunk/java/com/l2jserver/gameserver/network/serverpackets/itemappearance/ExShape_Shifting_Result.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2004-2015 L2J Server
- *
- * This file is part of L2J Server.
- *
- * L2J Server is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * L2J Server is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package com.l2jserver.gameserver.network.serverpackets.itemappearance;
-
-import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
-
-/**
- * @author Erlandys
- */
-public class ExShape_Shifting_Result extends L2GameServerPacket
-{
- private final int _success;
- private int _itemId = 0, _targetItemId = 0, _time = -1;
-
- public ExShape_Shifting_Result(int success)
- {
- _success = success;
- }
-
- public ExShape_Shifting_Result(int success, int itemId, int targetItemId)
- {
- _success = success;
- _itemId = itemId;
- _targetItemId = targetItemId;
- }
-
- public ExShape_Shifting_Result(int success, int itemId, int targetItemId, int time)
- {
- _success = success;
- _itemId = itemId;
- _targetItemId = targetItemId;
- _time = time;
- }
-
- @Override
- protected void writeImpl()
- {
- writeC(0xFE);
- writeH(0x12C);
- writeD(_success); // Success - 1, Fail - 0
- writeD(_itemId); // targetItemId
- writeD(_targetItemId); // extractItemId
- writeD(_time); // time
- }
-}