U3Games

Games | Desarrollo & Soporte => L2 | Sección de Servidores => Lineage => L2 | Implementaciones => Mensaje iniciado por: Swarlog en Jul 29, 2025, 12:10 AM

Título: Dressme Engine v3.2
Publicado por: Swarlog en Jul 29, 2025, 12:10 AM
CitarCORE:

Index: java/l2r/gameserver/model/itemcontainer/PcInventory.java
===================================================================
--- java/l2r/gameserver/model/itemcontainer/PcInventory.java (revision 232)
+++ java/l2r/gameserver/model/itemcontainer/PcInventory.java (working copy)
@@ -852,7 +852,7 @@
  {
  int[][] paperdoll = new int[31][3];
  try (Connection con = L2DatabaseFactory.getInstance().getConnection();
- PreparedStatement statement2 = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level FROM items WHERE owner_id=? AND loc='PAPERDOLL'"))
+ PreparedStatement statement2 = con.prepareStatement("SELECT object_id,item_id,loc_data,enchant_level,visual_item_id FROM items WHERE owner_id=? AND loc='PAPERDOLL'"))
  {
  statement2.setInt(1, objectId);
  try (ResultSet invdata = statement2.executeQuery())
@@ -861,7 +861,7 @@
  {
  int slot = invdata.getInt("loc_data");
  paperdoll[slot][0] = invdata.getInt("object_id");
- paperdoll[slot][1] = invdata.getInt("item_id");
+ paperdoll[slot][1] = invdata.getInt("visual_item_id") > 0 ? invdata.getInt("visual_item_id") : invdata.getInt("item_id");
  paperdoll[slot][2] = invdata.getInt("enchant_level");
  /*
  * 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"); }
Index: java/gr/sr/dressmeEngine/data/DressMeCloakData.java
===================================================================
--- java/gr/sr/dressmeEngine/data/DressMeCloakData.java (revision 0)
+++ java/gr/sr/dressmeEngine/data/DressMeCloakData.java (working copy)
@@ -0,0 +1,44 @@
+package gr.sr.dressmeEngine.data;
+
+public class DressMeCloakData
+{
+ private final int _id;
+ private final int _cloak;
+ private final String _name;
+ private final int _priceId;
+ private final long _priceCount;
+
+ public DressMeCloakData(int id, int cloak, String name, int priceId, long priceCount)
+ {
+ _id = id;
+ _cloak = cloak;
+ _name = name;
+ _priceId = priceId;
+ _priceCount = priceCount;
+ }
+
+ public int getId()
+ {
+ return _id;
+ }
+
+ public int getCloakId()
+ {
+ return _cloak;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public int getPriceId()
+ {
+ return _priceId;
+ }
+
+ public long getPriceCount()
+ {
+ return _priceCount;
+ }
+}
Index: java/gr/sr/dressmeEngine/xml/dataParser/DressMeShieldParser.java
===================================================================
--- java/gr/sr/dressmeEngine/xml/dataParser/DressMeShieldParser.java (revision 0)
+++ java/gr/sr/dressmeEngine/xml/dataParser/DressMeShieldParser.java (working copy)
@@ -0,0 +1,90 @@
+package gr.sr.dressmeEngine.xml.dataParser;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import l2r.Config;
+
+import gr.sr.data.xml.AbstractFileParser;
+import gr.sr.dressmeEngine.data.DressMeShieldData;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeShieldHolder;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+
+public final class DressMeShieldParser extends AbstractFileParser<DressMeShieldHolder>
+{
+ private final String SHIELD_FILE_PATH = Config.DATAPACK_ROOT + "/data/xml/sunrise/dressme/shield.xml";
+
+ private static final DressMeShieldParser _instance = new DressMeShieldParser();
+
+ public static DressMeShieldParser getInstance()
+ {
+ return _instance;
+ }
+
+ private DressMeShieldParser()
+ {
+ super(DressMeShieldHolder.getInstance());
+ }
+
+ @Override
+ public File getXMLFile()
+ {
+ return new File(SHIELD_FILE_PATH);
+ }
+
+ @Override
+ protected void readData()
+ {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setValidating(false);
+ factory.setIgnoringComments(true);
+
+ File file = getXMLFile();
+
+ try
+ {
+ InputSource in = new InputSource(new InputStreamReader(new FileInputStream(file), "UTF-8"));
+ in.setEncoding("UTF-8");
+ Document doc = factory.newDocumentBuilder().parse(in);
+
+ for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+ {
+ if (n.getNodeName().equalsIgnoreCase("list"))
+ {
+ for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+ {
+ if (d.getNodeName().equalsIgnoreCase("shield"))
+ {
+ int number = Integer.parseInt(d.getAttributes().getNamedItem("number").getNodeValue());
+ int id = Integer.parseInt(d.getAttributes().getNamedItem("id").getNodeValue());
+ String name = d.getAttributes().getNamedItem("name").getNodeValue();
+ int itemId = 0;
+ long itemCount = 0;
+
+ for (Node price = d.getFirstChild(); price != null; price = price.getNextSibling())
+ {
+ if ("price".equalsIgnoreCase(price.getNodeName()))
+ {
+ itemId = Integer.parseInt(price.getAttributes().getNamedItem("id").getNodeValue());
+ itemCount = Long.parseLong(price.getAttributes().getNamedItem("count").getNodeValue());
+ }
+ }
+
+ getHolder().addShield(new DressMeShieldData(number, id, name, itemId, itemCount));
+ }
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ _log.warn(getClass().getSimpleName() + ": Error: " + e);
+ }
+ }
+}
\ No newline at end of file
Index: java/l2r/gameserver/network/serverpackets/CharInfo.java
===================================================================
--- java/l2r/gameserver/network/serverpackets/CharInfo.java (revision 232)
+++ java/l2r/gameserver/network/serverpackets/CharInfo.java (working copy)
@@ -232,7 +232,7 @@
 
  for (int slot : getPaperdollOrder())
  {
- writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
+ writeD(_activeChar.isInOlympiadMode() || !_activeChar.getVarB("showVisualChange") ? _activeChar.getInventory().getPaperdollItemDisplayId(slot) : _activeChar.getInventory().getPaperdollItemVisualDisplayId(slot));
  }
 
  for (int slot : getPaperdollOrder())
Index: java/l2r/gameserver/GameServer.java
===================================================================
--- java/l2r/gameserver/GameServer.java (revision 254)
+++ java/l2r/gameserver/GameServer.java (working copy)
@@ -140,6 +140,7 @@
 import l2r.util.IPv4Filter;
 
 import gr.sr.configsEngine.ConfigsController;
+import gr.sr.dressmeEngine.DressMeLoader;
 import gr.sr.interf.SunriseEvents;
 import gr.sr.main.PlayerValues;
 import gr.sr.main.SunriseInfo;
@@ -395,6 +396,8 @@
  // System.out.println("Loading static images....");
  // CustomServerMods.getInstance().loadStaticImages();
 
+ DressMeLoader.load();
+
  Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
 
  _log.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
Index: java/l2r/gameserver/network/serverpackets/UserInfo.java
===================================================================
--- java/l2r/gameserver/network/serverpackets/UserInfo.java (revision 232)
+++ java/l2r/gameserver/network/serverpackets/UserInfo.java (working copy)
@@ -123,7 +123,7 @@
 
  for (int slot : getPaperdollOrder())
  {
- writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
+ writeD(_activeChar.getInventory().getPaperdollItemVisualDisplayId(slot));
  }
 
  for (int slot : getPaperdollOrder())
Index: java/gr/sr/dressmeEngine/DressMeLoader.java
===================================================================
--- java/gr/sr/dressmeEngine/DressMeLoader.java (revision 0)
+++ java/gr/sr/dressmeEngine/DressMeLoader.java (working copy)
@@ -0,0 +1,263 @@
+package gr.sr.dressmeEngine;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import l2r.gameserver.handler.VoicedCommandHandler;
+
+import gr.sr.dressmeEngine.data.DressMeArmorData;
+import gr.sr.dressmeEngine.data.DressMeHatData;
+import gr.sr.dressmeEngine.data.DressMeWeaponData;
+import gr.sr.dressmeEngine.handler.DressMeVCmd;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeArmorHolder;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeHatHolder;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeWeaponHolder;
+import gr.sr.dressmeEngine.xml.dataParser.DressMeArmorParser;
+import gr.sr.dressmeEngine.xml.dataParser.DressMeCloakParser;
+import gr.sr.dressmeEngine.xml.dataParser.DressMeHatParser;
+import gr.sr.dressmeEngine.xml.dataParser.DressMeShieldParser;
+import gr.sr.dressmeEngine.xml.dataParser.DressMeWeaponParser;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DressMeLoader
+{
+ private static final Logger _log = LoggerFactory.getLogger(DressMeLoader.class);
+
+ public static Map<Integer, DressMeWeaponData> SWORD;
+ public static Map<Integer, DressMeWeaponData> BLUNT;
+ public static Map<Integer, DressMeWeaponData> DAGGER;
+ public static Map<Integer, DressMeWeaponData> BOW;
+ public static Map<Integer, DressMeWeaponData> POLE;
+ public static Map<Integer, DressMeWeaponData> FIST;
+ public static Map<Integer, DressMeWeaponData> DUAL;
+ public static Map<Integer, DressMeWeaponData> DUALFIST;
+ public static Map<Integer, DressMeWeaponData> BIGSWORD;
+ public static Map<Integer, DressMeWeaponData> ROD;
+ public static Map<Integer, DressMeWeaponData> BIGBLUNT;
+ public static Map<Integer, DressMeWeaponData> CROSSBOW;
+ public static Map<Integer, DressMeWeaponData> RAPIER;
+ public static Map<Integer, DressMeWeaponData> ANCIENTSWORD;
+ public static Map<Integer, DressMeWeaponData> DUALDAGGER;
+
+ public static Map<Integer, DressMeArmorData> LIGHT;
+ public static Map<Integer, DressMeArmorData> HEAVY;
+ public static Map<Integer, DressMeArmorData> ROBE;
+
+ public static Map<Integer, DressMeHatData> HAIR;
+ public static Map<Integer, DressMeHatData> HAIR2;
+ public static Map<Integer, DressMeHatData> HAIR_FULL;
+
+ public static void load()
+ {
+ DressMeArmorParser.getInstance().load();
+ DressMeCloakParser.getInstance().load();
+ DressMeHatParser.getInstance().load();
+ DressMeShieldParser.getInstance().load();
+ DressMeWeaponParser.getInstance().load();
+
+ SWORD = new HashMap<>();
+ BLUNT = new HashMap<>();
+ DAGGER = new HashMap<>();
+ BOW = new HashMap<>();
+ POLE = new HashMap<>();
+ FIST = new HashMap<>();
+ DUAL = new HashMap<>();
+ DUALFIST = new HashMap<>();
+ BIGSWORD = new HashMap<>();
+ ROD = new HashMap<>();
+ BIGBLUNT = new HashMap<>();
+ CROSSBOW = new HashMap<>();
+ RAPIER = new HashMap<>();
+ ANCIENTSWORD = new HashMap<>();
+ DUALDAGGER = new HashMap<>();
+
+ LIGHT = new HashMap<>();
+ HEAVY = new HashMap<>();
+ ROBE = new HashMap<>();
+
+ HAIR = new HashMap<>();
+ HAIR2 = new HashMap<>();
+ HAIR_FULL = new HashMap<>();
+
+ parseWeapon();
+ parseArmor();
+ parseHat();
+ VoicedCommandHandler.getInstance().registerHandler(new DressMeVCmd());
+ }
+
+ private static int parseWeapon()
+ {
+ int Sword = 1, Blunt = 1, Dagger = 1, Bow = 1, Pole = 1, Fist = 1, DualSword = 1, DualFist = 1, BigSword = 1, Rod = 1, BigBlunt = 1, Crossbow = 1, Rapier = 1, AncientSword = 1, DualDagger = 1;
+
+ for (DressMeWeaponData weapon : DressMeWeaponHolder.getInstance().getAllWeapons())
+ {
+ if (weapon.getType().equals("SWORD") && !weapon.isBig())
+ {
+ SWORD.put(Sword, weapon);
+ Sword++;
+ }
+ else if (weapon.getType().equals("BLUNT") && !weapon.isBig())
+ {
+ BLUNT.put(Blunt, weapon);
+ Blunt++;
+ }
+ else if (weapon.getType().equals("SWORD") && weapon.isBig())
+ {
+ BIGSWORD.put(BigSword, weapon);
+ BigSword++;
+ }
+ else if (weapon.getType().equals("BLUNT") && weapon.isBig())
+ {
+ BIGBLUNT.put(BigBlunt, weapon);
+ BigBlunt++;
+ }
+ else if (weapon.getType().equals("DAGGER"))
+ {
+ DAGGER.put(Dagger, weapon);
+ Dagger++;
+ }
+ else if (weapon.getType().equals("BOW"))
+ {
+ BOW.put(Bow, weapon);
+ Bow++;
+ }
+ else if (weapon.getType().equals("POLE"))
+ {
+ POLE.put(Pole, weapon);
+ Pole++;
+ }
+ else if (weapon.getType().equals("FIST"))
+ {
+ FIST.put(Fist, weapon);
+ Fist++;
+ }
+ else if (weapon.getType().equals("DUAL"))
+ {
+ DUAL.put(DualSword, weapon);
+ DualSword++;
+ }
+ else if (weapon.getType().equals("DUALFIST"))
+ {
+ DUALFIST.put(DualFist, weapon);
+ DualFist++;
+ }
+ else if (weapon.getType().equals("FISHINGROD"))
+ {
+ ROD.put(Rod, weapon);
+ Rod++;
+ }
+ else if (weapon.getType().equals("CROSSBOW"))
+ {
+ CROSSBOW.put(Crossbow, weapon);
+ Crossbow++;
+ }
+ else if (weapon.getType().equals("RAPIER"))
+ {
+ RAPIER.put(Rapier, weapon);
+ Rapier++;
+ }
+ else if (weapon.getType().equals("ANCIENTSWORD"))
+ {
+ ANCIENTSWORD.put(AncientSword, weapon);
+ AncientSword++;
+ }
+ else if (weapon.getType().equals("DUALDAGGER"))
+ {
+ DUALDAGGER.put(DualDagger, weapon);
+ DualDagger++;
+ }
+ else
+ {
+ _log.error("Dress me system: Can't find type: " + weapon.getType());
+ }
+ }
+
+ _log.info("Dress me system: Loaded " + (Sword - 1) + " Sword(s).");
+ _log.info("Dress me system: Loaded " + (Blunt - 1) + " Blunt(s).");
+ _log.info("Dress me system: Loaded " + (Dagger - 1) + " Dagger(s).");
+ _log.info("Dress me system: Loaded " + (Bow - 1) + " Bow(s).");
+ _log.info("Dress me system: Loaded " + (Pole - 1) + " Pole(s).");
+ _log.info("Dress me system: Loaded " + (Fist - 1) + " Fist(s).");
+ _log.info("Dress me system: Loaded " + (DualSword - 1) + " Dual Sword(s).");
+ _log.info("Dress me system: Loaded " + (DualFist - 1) + " Dual Fist(s).");
+ _log.info("Dress me system: Loaded " + (BigSword - 1) + " Big Sword(s).");
+ _log.info("Dress me system: Loaded " + (Rod - 1) + " Rod(s).");
+ _log.info("Dress me system: Loaded " + (BigBlunt - 1) + " Big Blunt(s).");
+ _log.info("Dress me system: Loaded " + (Crossbow - 1) + " Crossbow(s).");
+ _log.info("Dress me system: Loaded " + (Rapier - 1) + " Rapier(s).");
+ _log.info("Dress me system: Loaded " + (AncientSword - 1) + " Ancient Sword(s).");
+ _log.info("Dress me system: Loaded " + (DualDagger - 1) + " Dual Dagger(s).");
+
+ return 0;
+ }
+
+ private static int parseArmor()
+ {
+ int light = 1, heavy = 1, robe = 1;
+
+ for (DressMeArmorData armor : DressMeArmorHolder.getInstance().getAllDress())
+ {
+ if (armor.getType().equals("LIGHT"))
+ {
+ LIGHT.put(light, armor);
+ light++;
+ }
+ else if (armor.getType().equals("HEAVY"))
+ {
+ HEAVY.put(heavy, armor);
+ heavy++;
+ }
+ else if (armor.getType().equals("ROBE"))
+ {
+ ROBE.put(robe, armor);
+ robe++;
+ }
+ else
+ {
+ _log.error("Dress me system: Can't find type: " + armor.getType());
+ }
+ }
+
+ _log.info("Dress me system: Loaded " + (light - 1) + " Light Armor(s).");
+ _log.info("Dress me system: Loaded " + (heavy - 1) + " Heavy Armor(s).");
+ _log.info("Dress me system: Loaded " + (robe - 1) + " Robe Armor(s).");
+
+ return 0;
+ }
+
+ private static int parseHat()
+ {
+ int hair = 1, hair2 = 1, full_hair = 1;
+
+ for (DressMeHatData hat : DressMeHatHolder.getInstance().getAllHats())
+ {
+ if (hat.getSlot() == 1)
+ {
+ HAIR.put(hair, hat);
+ hair++;
+ }
+ else if (hat.getSlot() == 2)
+ {
+ HAIR2.put(hair2, hat);
+ hair2++;
+ }
+ else if (hat.getSlot() == 3)
+ {
+ HAIR_FULL.put(full_hair, hat);
+ full_hair++;
+ }
+ else
+ {
+ _log.error("Dress me system: Can't find slot: " + hat.getSlot());
+ }
+ }
+
+ _log.info("Dress me system: Loaded " + (hair - 1) + " Hair(s).");
+ _log.info("Dress me system: Loaded " + (hair2 - 1) + " Hair2(s).");
+ _log.info("Dress me system: Loaded " + (full_hair - 1) + " Full Hair(s).");
+
+ return 0;
+ }
+}
Index: java/gr/sr/dressmeEngine/xml/dataParser/DressMeCloakParser.java
===================================================================
--- java/gr/sr/dressmeEngine/xml/dataParser/DressMeCloakParser.java (revision 0)
+++ java/gr/sr/dressmeEngine/xml/dataParser/DressMeCloakParser.java (working copy)
@@ -0,0 +1,90 @@
+package gr.sr.dressmeEngine.xml.dataParser;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import l2r.Config;
+
+import gr.sr.data.xml.AbstractFileParser;
+import gr.sr.dressmeEngine.data.DressMeCloakData;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeCloakHolder;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+
+public final class DressMeCloakParser extends AbstractFileParser<DressMeCloakHolder>
+{
+ private final String CLOAK_FILE_PATH = Config.DATAPACK_ROOT + "/data/xml/sunrise/dressme/cloak.xml";
+
+ private static final DressMeCloakParser _instance = new DressMeCloakParser();
+
+ public static DressMeCloakParser getInstance()
+ {
+ return _instance;
+ }
+
+ private DressMeCloakParser()
+ {
+ super(DressMeCloakHolder.getInstance());
+ }
+
+ @Override
+ public File getXMLFile()
+ {
+ return new File(CLOAK_FILE_PATH);
+ }
+
+ @Override
+ protected void readData()
+ {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setValidating(false);
+ factory.setIgnoringComments(true);
+
+ File file = getXMLFile();
+
+ try
+ {
+ InputSource in = new InputSource(new InputStreamReader(new FileInputStream(file), "UTF-8"));
+ in.setEncoding("UTF-8");
+ Document doc = factory.newDocumentBuilder().parse(in);
+
+ for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+ {
+ if (n.getNodeName().equalsIgnoreCase("list"))
+ {
+ for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+ {
+ if (d.getNodeName().equalsIgnoreCase("cloak"))
+ {
+ int number = Integer.parseInt(d.getAttributes().getNamedItem("number").getNodeValue());
+ int id = Integer.parseInt(d.getAttributes().getNamedItem("id").getNodeValue());
+ String name = d.getAttributes().getNamedItem("name").getNodeValue();
+ int itemId = 0;
+ long itemCount = 0;
+
+ for (Node price = d.getFirstChild(); price != null; price = price.getNextSibling())
+ {
+ if ("price".equalsIgnoreCase(price.getNodeName()))
+ {
+ itemId = Integer.parseInt(price.getAttributes().getNamedItem("id").getNodeValue());
+ itemCount = Long.parseLong(price.getAttributes().getNamedItem("count").getNodeValue());
+ }
+ }
+
+ getHolder().addCloak(new DressMeCloakData(number, id, name, itemId, itemCount));
+ }
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ _log.warn(getClass().getSimpleName() + ": Error: " + e);
+ }
+ }
+}
\ No newline at end of file
Index: java/gr/sr/dressmeEngine/xml/dataParser/DressMeWeaponParser.java
===================================================================
--- java/gr/sr/dressmeEngine/xml/dataParser/DressMeWeaponParser.java (revision 0)
+++ java/gr/sr/dressmeEngine/xml/dataParser/DressMeWeaponParser.java (working copy)
@@ -0,0 +1,94 @@
+package gr.sr.dressmeEngine.xml.dataParser;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import l2r.Config;
+
+import gr.sr.data.xml.AbstractFileParser;
+import gr.sr.dressmeEngine.data.DressMeWeaponData;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeWeaponHolder;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+
+public final class DressMeWeaponParser extends AbstractFileParser<DressMeWeaponHolder>
+{
+ private final String WEAPON_FILE_PATH = Config.DATAPACK_ROOT + "/data/xml/sunrise/dressme/weapon.xml";
+
+ private static final DressMeWeaponParser _instance = new DressMeWeaponParser();
+
+ public static DressMeWeaponParser getInstance()
+ {
+ return _instance;
+ }
+
+ private DressMeWeaponParser()
+ {
+ super(DressMeWeaponHolder.getInstance());
+ }
+
+ @Override
+ public File getXMLFile()
+ {
+ return new File(WEAPON_FILE_PATH);
+ }
+
+ @Override
+ protected void readData()
+ {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setValidating(false);
+ factory.setIgnoringComments(true);
+
+ File file = getXMLFile();
+
+ try
+ {
+ InputSource in = new InputSource(new InputStreamReader(new FileInputStream(file), "UTF-8"));
+ in.setEncoding("UTF-8");
+ Document doc = factory.newDocumentBuilder().parse(in);
+
+ for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+ {
+ if (n.getNodeName().equalsIgnoreCase("list"))
+ {
+ for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+ {
+ if (d.getNodeName().equalsIgnoreCase("weapon"))
+ {
+ int id = Integer.parseInt(d.getAttributes().getNamedItem("id").getNodeValue());
+ String name = d.getAttributes().getNamedItem("name").getNodeValue();
+ String type = d.getAttributes().getNamedItem("type").getNodeValue();
+
+ Node isBigNode = d.getAttributes().getNamedItem("isBig");
+ Boolean isBig = (isBigNode != null) && Boolean.parseBoolean(isBigNode.getNodeValue());
+
+ int itemId = 0;
+ long itemCount = 0;
+
+ for (Node price = d.getFirstChild(); price != null; price = price.getNextSibling())
+ {
+ if ("price".equalsIgnoreCase(price.getNodeName()))
+ {
+ itemId = Integer.parseInt(price.getAttributes().getNamedItem("id").getNodeValue());
+ itemCount = Long.parseLong(price.getAttributes().getNamedItem("count").getNodeValue());
+ }
+ }
+
+ getHolder().addWeapon(new DressMeWeaponData(id, name, type, isBig, itemId, itemCount));
+ }
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ _log.warn(getClass().getSimpleName() + ": Error: " + e);
+ }
+ }
+}
\ No newline at end of file
Index: java/gr/sr/dressmeEngine/util/Util.java
===================================================================
--- java/gr/sr/dressmeEngine/util/Util.java (revision 0)
+++ java/gr/sr/dressmeEngine/util/Util.java (working copy)
@@ -0,0 +1,57 @@
+package gr.sr.dressmeEngine.util;
+
+import java.text.NumberFormat;
+import java.util.Locale;
+
+import l2r.gameserver.data.xml.impl.ItemData;
+import l2r.gameserver.model.actor.instance.L2PcInstance;
+import l2r.gameserver.model.itemcontainer.Inventory;
+
+public class Util
+{
+ public static String getItemName(int itemId)
+ {
+ if (itemId == Inventory.ITEM_ID_FAME)
+ {
+ return "Fame";
+ }
+ else if (itemId == Inventory.ITEM_ID_PC_BANG_POINTS)
+ {
+ return "PC Bang point";
+ }
+ else if (itemId == Inventory.ITEM_ID_CLAN_REPUTATION_SCORE)
+ {
+ return "Clan reputation";
+ }
+ else
+ {
+ return ItemData.getInstance().getTemplate(itemId).getName();
+ }
+ }
+
+ public static String getItemIcon(int itemId)
+ {
+ return ItemData.getInstance().getTemplate(itemId).getIcon();
+ }
+
+ public static String formatPay(L2PcInstance player, long count, int item)
+ {
+ if (count > 0)
+ {
+ return formatAdena(count) + " " + getItemName(item);
+ }
+ return "Free";
+ }
+
+ private static NumberFormat adenaFormatter = NumberFormat.getIntegerInstance(Locale.FRANCE);
+
+ /**
+ * Return amount of adena formatted with " " delimiter
+ * @param amount
+ * @return String formatted adena amount
+ */
+ public static String formatAdena(long amount)
+ {
+ return adenaFormatter.format(amount);
+ }
+}
Index: java/gr/sr/dressmeEngine/xml/dataParser/DressMeArmorParser.java
===================================================================
--- java/gr/sr/dressmeEngine/xml/dataParser/DressMeArmorParser.java (revision 0)
+++ java/gr/sr/dressmeEngine/xml/dataParser/DressMeArmorParser.java (working copy)
@@ -0,0 +1,103 @@
+package gr.sr.dressmeEngine.xml.dataParser;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import l2r.Config;
+
+import gr.sr.data.xml.AbstractFileParser;
+import gr.sr.dressmeEngine.data.DressMeArmorData;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeArmorHolder;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+
+public final class DressMeArmorParser extends AbstractFileParser<DressMeArmorHolder>
+{
+ private final String ARMOR_FILE_PATH = Config.DATAPACK_ROOT + "/data/xml/sunrise/dressme/armor.xml";
+
+ private static final DressMeArmorParser _instance = new DressMeArmorParser();
+
+ public static DressMeArmorParser getInstance()
+ {
+ return _instance;
+ }
+
+ private DressMeArmorParser()
+ {
+ super(DressMeArmorHolder.getInstance());
+ }
+
+ @Override
+ public File getXMLFile()
+ {
+ return new File(ARMOR_FILE_PATH);
+ }
+
+ @Override
+ protected void readData()
+ {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setValidating(false);
+ factory.setIgnoringComments(true);
+
+ File file = getXMLFile();
+
+ try
+ {
+ InputSource in = new InputSource(new InputStreamReader(new FileInputStream(file), "UTF-8"));
+ in.setEncoding("UTF-8");
+ Document doc = factory.newDocumentBuilder().parse(in);
+
+ for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+ {
+ if (n.getNodeName().equalsIgnoreCase("list"))
+ {
+ for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+ {
+ if (d.getNodeName().equalsIgnoreCase("dress"))
+ {
+ int id = Integer.parseInt(d.getAttributes().getNamedItem("id").getNodeValue());
+ String name = d.getAttributes().getNamedItem("name").getNodeValue();
+ String type = d.getAttributes().getNamedItem("type").getNodeValue();
+
+ int itemId = 0;
+ long itemCount = 0;
+ int chest = 0;
+ int legs = 0;
+ int gloves = 0;
+ int feet = 0;
+
+ for (Node att = d.getFirstChild(); att != null; att = att.getNextSibling())
+ {
+ if ("set".equalsIgnoreCase(att.getNodeName()))
+ {
+ chest = Integer.parseInt(att.getAttributes().getNamedItem("chest").getNodeValue());
+ legs = Integer.parseInt(att.getAttributes().getNamedItem("legs").getNodeValue());
+ gloves = Integer.parseInt(att.getAttributes().getNamedItem("gloves").getNodeValue());
+ feet = Integer.parseInt(att.getAttributes().getNamedItem("feet").getNodeValue());
+ }
+
+ if ("price".equalsIgnoreCase(att.getNodeName()))
+ {
+ itemId = Integer.parseInt(att.getAttributes().getNamedItem("id").getNodeValue());
+ itemCount = Long.parseLong(att.getAttributes().getNamedItem("count").getNodeValue());
+ }
+ }
+
+ getHolder().addDress(new DressMeArmorData(id, name, type, chest, legs, gloves, feet, itemId, itemCount));
+ }
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ _log.warn(getClass().getSimpleName() + ": Error: " + e);
+ }
+ }
+}
\ No newline at end of file
Index: java/l2r/gameserver/model/itemcontainer/Mail.java
===================================================================
--- java/l2r/gameserver/model/itemcontainer/Mail.java (revision 232)
+++ java/l2r/gameserver/model/itemcontainer/Mail.java (working copy)
@@ -118,7 +118,7 @@
  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 FROM items WHERE owner_id=? AND loc=? AND loc_data=?"))
+ PreparedStatement statement = con.prepareStatement("SELECT object_id, item_id, count, enchant_level, loc, loc_data, custom_type1, custom_type2, mana_left, time, visual_item_id FROM items WHERE owner_id=? AND loc=? AND loc_data=?"))
  {
  statement.setInt(1, getOwnerId());
  statement.setString(2, getBaseLocation().name());
Index: java/gr/sr/dressmeEngine/handler/DressMeVCmd.java
===================================================================
--- java/gr/sr/dressmeEngine/handler/DressMeVCmd.java (revision 0)
+++ java/gr/sr/dressmeEngine/handler/DressMeVCmd.java (working copy)
@@ -0,0 +1,1063 @@
+package gr.sr.dressmeEngine.handler;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import l2r.gameserver.cache.HtmCache;
+import l2r.gameserver.data.xml.impl.ArmorSetsData;
+import l2r.gameserver.data.xml.impl.ItemData;
+import l2r.gameserver.handler.IVoicedCommandHandler;
+import l2r.gameserver.model.L2ArmorSet;
+import l2r.gameserver.model.actor.instance.L2PcInstance;
+import l2r.gameserver.model.itemcontainer.Inventory;
+import l2r.gameserver.model.items.L2Item;
+import l2r.gameserver.model.items.instance.L2ItemInstance;
+import l2r.gameserver.model.items.type.ItemType;
+import l2r.gameserver.network.serverpackets.NpcHtmlMessage;
+
+import gr.sr.dressmeEngine.DressMeHandler;
+import gr.sr.dressmeEngine.data.DressMeArmorData;
+import gr.sr.dressmeEngine.data.DressMeCloakData;
+import gr.sr.dressmeEngine.data.DressMeHatData;
+import gr.sr.dressmeEngine.data.DressMeShieldData;
+import gr.sr.dressmeEngine.data.DressMeWeaponData;
+import gr.sr.dressmeEngine.util.Util;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeArmorHolder;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeCloakHolder;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeHatHolder;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeShieldHolder;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeWeaponHolder;
+import gr.sr.main.Conditions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DressMeVCmd implements IVoicedCommandHandler
+{
+ private static final Logger _log = LoggerFactory.getLogger(DressMeVCmd.class);
+
+ String index_path = "data/html/sunrise/dressme/index.htm";
+ String info_path = "data/html/sunrise/dressme/info.htm";
+ String undressme_path = "data/html/sunrise/dressme/undressme.htm";
+
+ String index_armor_path = "data/html/sunrise/dressme/index-armor.htm";
+ String template_armor_path = "data/html/sunrise/dressme/template-armor.htm";
+
+ String index_cloak = "data/html/sunrise/dressme/index-cloak.htm";
+ String template_cloak_path = "data/html/sunrise/dressme/template-cloak.htm";
+
+ String index_shield_path = "data/html/sunrise/dressme/index-shield.htm";
+ String template_shield_path = "data/html/sunrise/dressme/template-shield.htm";
+
+ String index_weapon_path = "data/html/sunrise/dressme/index-weapon.htm";
+ String template_weapon_path = "data/html/sunrise/dressme/template-weapon.htm";
+
+ String index_hat_path = "data/html/sunrise/dressme/index-hat.htm";
+ String template_hat_path = "data/html/sunrise/dressme/template-hat.htm";
+
+ String dress_cloak_path = "data/html/sunrise/dressme/dress-cloak.htm";
+ String dress_shield_path = "data/html/sunrise/dressme/dress-shield.htm";
+ String dress_armor_path = "data/html/sunrise/dressme/dress-armor.htm";
+ String dress_weapon_path = "data/html/sunrise/dressme/dress-weapon.htm";
+ String dress_hat_path = "data/html/sunrise/dressme/dress-hat.htm";
+
+ private final String[] _commandList = new String[]
+ {
+ "dressme",
+ "undressme",
+
+ "dressinfo",
+
+ "showdress",
+ "hidedress",
+
+ "dressme-armor",
+ "dress-armor",
+ "dress-armorpage",
+ "undressme-armor",
+
+ "dressme-cloak",
+ "dress-cloak",
+ "dress-cloakpage",
+ "undressme-cloak",
+
+ "dressme-shield",
+ "dress-shield",
+ "dress-shieldpage",
+ "undressme-shield",
+
+ "dressme-weapon",
+ "dress-weapon",
+ "dress-weaponpage",
+ "undressme-weapon",
+
+ "dressme-hat",
+ "dress-hat",
+ "dress-hatpage",
+ "undressme-hat"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, L2PcInstance player, String args)
+ {
+ if (command.equals("dressme"))
+ {
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), index_path);
+ html = html.replace("<?show_hide?>", !player.getVarB("showVisualChange") ? "Show visual equip on other player!" : "Hide visual equip on other player!");
+ html = html.replace("<?show_hide_b?>", !player.getVarB("showVisualChange") ? "showdress" : "hidedress");
+
+ sendHtml(player, html);
+ return true;
+ }
+ else if (command.equals("dressme-armor"))
+ {
+ L2ItemInstance slot = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST);
+ if ((slot == null) || !slot.isArmor())
+ {
+ player.sendMessage("Error: Armor chest must be equiped!");
+ return false;
+ }
+
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), index_armor_path);
+ String template = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), template_armor_path);
+ String block = "";
+ String list = "";
+
+ if (args == null)
+ {
+ args = "1";
+ }
+
+ String[] param = args.split(" ");
+
+ final int page = param[0].length() > 0 ? Integer.parseInt(param[0]) : 1;
+ final int perpage = 5;
+ int counter = 0;
+
+ String type = slot.getArmorItem().getItemType().getDescription();
+ Map<Integer, DressMeArmorData> map = DressMeHandler.initArmorMap(type, new HashMap<>(), slot);
+ if (map == null)
+ {
+ _log.error("Dress me system: Armor Map is null.");
+ return false;
+ }
+
+ for (int i = (page - 1) * perpage; i < map.size(); i++)
+ {
+ DressMeArmorData dress = map.get(i + 1);
+ if (dress != null)
+ {
+ block = template;
+
+ String dress_name = dress.getName();
+
+ if (dress_name.length() > 29)
+ {
+ dress_name = dress_name.substring(0, 29) + "...";
+ }
+
+ block = block.replace("{bypass}", "bypass -h voice .dress-armorpage " + dress.getId());
+ block = block.replace("{name}", dress_name);
+ block = block.replace("{price}", Util.formatPay(player, dress.getPriceCount(), dress.getPriceId()));
+ block = block.replace("{icon}", Util.getItemIcon(dress.getChest()));
+ list += block;
+ }
+
+ counter++;
+
+ if (counter >= perpage)
+ {
+ break;
+ }
+ }
+
+ double count = Math.ceil((double) map.size() / perpage);
+ int inline = 1;
+ String navigation = "";
+
+ for (int i = 1; i <= count; i++)
+ {
+ if (i == page)
+ {
+ navigation += "<td width=25 align=center valign=top><button value=\"[" + i + "]\" action=\"bypass -h voice .dressme-armor " + i + "\" width=32 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>";
+ }
+ else
+ {
+ navigation += "<td width=25 align=center valign=top><button value=\"" + i + "\" action=\"bypass -h voice .dressme-armor " + i + "\" width=32 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>";
+ }
+
+ if (inline == 7)
+ {
+ navigation += "</tr><tr>";
+ inline = 0;
+ }
+ inline++;
+ }
+
+ if (navigation.equals(""))
+ {
+ navigation = "<td width=30 align=center valign=top>...</td>";
+ }
+
+ html = html.replace("{list}", list);
+ html = html.replace("{navigation}", navigation);
+
+ NpcHtmlMessage msg = new NpcHtmlMessage();
+ msg.setHtml(html);
+ player.sendPacket(msg);
+ return true;
+ }
+ else if (command.equals("dressme-cloak"))
+ {
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), index_cloak);
+ String template = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), template_cloak_path);
+ String block = "";
+ String list = "";
+
+ if (args == null)
+ {
+ args = "1";
+ }
+
+ String[] param = args.split(" ");
+
+ final int page = param[0].length() > 0 ? Integer.parseInt(param[0]) : 1;
+ final int perpage = 5;
+ int counter = 0;
+
+ for (int i = (page - 1) * perpage; i < DressMeCloakHolder.getInstance().size(); i++)
+ {
+ DressMeCloakData cloak = DressMeCloakHolder.getInstance().getCloak(i + 1);
+ if (cloak != null)
+ {
+ block = template;
+
+ String cloak_name = cloak.getName();
+
+ if (cloak_name.length() > 29)
+ {
+ cloak_name = cloak_name.substring(0, 29) + "...";
+ }
+
+ block = block.replace("{bypass}", "bypass -h voice .dress-cloakpage " + (i + 1));
+ block = block.replace("{name}", cloak_name);
+ block = block.replace("{price}", Util.formatPay(player, cloak.getPriceCount(), cloak.getPriceId()));
+ block = block.replace("{icon}", Util.getItemIcon(cloak.getCloakId()));
+ list += block;
+ }
+
+ counter++;
+
+ if (counter >= perpage)
+ {
+ break;
+ }
+ }
+
+ double count = Math.ceil((double) DressMeCloakHolder.getInstance().size() / perpage);
+ int inline = 1;
+ String navigation = "";
+
+ for (int i = 1; i <= count; i++)
+ {
+ if (i == page)
+ {
+ navigation += "<td width=25 align=center valign=top><button value=\"[" + i + "]\" action=\"bypass -h voice .dressme-cloak " + i + "\" width=32 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>";
+ }
+ else
+ {
+ navigation += "<td width=25 align=center valign=top><button value=\"" + i + "\" action=\"bypass -h voice .dressme-cloak " + i + "\" width=32 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>";
+ }
+
+ if (inline == 7)
+ {
+ navigation += "</tr><tr>";
+ inline = 0;
+ }
+ inline++;
+ }
+
+ if (navigation.equals(""))
+ {
+ navigation = "<td width=30 align=center valign=top>...</td>";
+ }
+
+ html = html.replace("{list}", list);
+ html = html.replace("{navigation}", navigation);
+
+ sendHtml(player, html);
+ return true;
+ }
+ else if (command.equals("dressme-shield"))
+ {
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), index_shield_path);
+ String template = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), template_shield_path);
+ String block = "";
+ String list = "";
+
+ if (args == null)
+ {
+ args = "1";
+ }
+
+ String[] param = args.split(" ");
+
+ final int page = param[0].length() > 0 ? Integer.parseInt(param[0]) : 1;
+ final int perpage = 5;
+ int counter = 0;
+
+ for (int i = (page - 1) * perpage; i < DressMeShieldHolder.getInstance().size(); i++)
+ {
+ DressMeShieldData shield = DressMeShieldHolder.getInstance().getShield(i + 1);
+ if (shield != null)
+ {
+ block = template;
+
+ String shield_name = shield.getName();
+
+ if (shield_name.length() > 29)
+ {
+ shield_name = shield_name.substring(0, 29) + "...";
+ }
+
+ block = block.replace("{bypass}", "bypass -h voice .dress-shieldpage " + (i + 1));
+ block = block.replace("{name}", shield_name);
+ block = block.replace("{price}", Util.formatPay(player, shield.getPriceCount(), shield.getPriceId()));
+ block = block.replace("{icon}", Util.getItemIcon(shield.getShieldId()));
+ list += block;
+ }
+
+ counter++;
+
+ if (counter >= perpage)
+ {
+ break;
+ }
+ }
+
+ double count = Math.ceil((double) DressMeShieldHolder.getInstance().size() / perpage);
+ int inline = 1;
+ String navigation = "";
+
+ for (int i = 1; i <= count; i++)
+ {
+ if (i == page)
+ {
+ navigation += "<td width=25 align=center valign=top><button value=\"[" + i + "]\" action=\"bypass -h voice .dressme-shield " + i + "\" width=32 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>";
+ }
+ else
+ {
+ navigation += "<td width=25 align=center valign=top><button value=\"" + i + "\" action=\"bypass -h voice .dressme-shield " + i + "\" width=32 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>";
+ }
+
+ if (inline == 7)
+ {
+ navigation += "</tr><tr>";
+ inline = 0;
+ }
+ inline++;
+ }
+
+ if (navigation.equals(""))
+ {
+ navigation = "<td width=30 align=center valign=top>...</td>";
+ }
+
+ html = html.replace("{list}", list);
+ html = html.replace("{navigation}", navigation);
+
+ sendHtml(player, html);
+ return true;
+ }
+ else if (command.equals("dressme-weapon"))
+ {
+ L2ItemInstance slot = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
+ if (slot == null)
+ {
+ player.sendMessage("Error: Weapon must be equiped!");
+ return false;
+ }
+
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), index_weapon_path);
+ String template = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), template_weapon_path);
+ String block = "";
+ String list = "";
+
+ if (args == null)
+ {
+ args = "1";
+ }
+
+ String[] param = args.split(" ");
+
+ final int page = param[0].length() > 0 ? Integer.parseInt(param[0]) : 1;
+ final int perpage = 5;
+ int counter = 0;
+
+ ItemType type = slot.getItemType();
+ Map<Integer, DressMeWeaponData> map = DressMeHandler.initWeaponMap(type.toString(), new HashMap<>(), slot);
+ if (map == null)
+ {
+ _log.error("Dress me system: Weapon Map is null.");
+ return false;
+ }
+
+ for (int i = (page - 1) * perpage; i < map.size(); i++)
+ {
+ DressMeWeaponData weapon = map.get(i + 1);
+ if (weapon != null)
+ {
+ block = template;
+
+ String cloak_name = weapon.getName();
+
+ if (cloak_name.length() > 29)
+ {
+ cloak_name = cloak_name.substring(0, 29) + "...";
+ }
+
+ block = block.replace("{bypass}", "bypass -h voice .dress-weaponpage " + weapon.getId());
+ block = block.replace("{name}", cloak_name);
+ block = block.replace("{price}", Util.formatPay(player, weapon.getPriceCount(), weapon.getPriceId()));
+ block = block.replace("{icon}", Util.getItemIcon(weapon.getId()));
+ list += block;
+ }
+
+ counter++;
+
+ if (counter >= perpage)
+ {
+ break;
+ }
+ }
+
+ double count = Math.ceil((double) map.size() / perpage);
+ int inline = 1;
+ String navigation = "";
+
+ for (int i = 1; i <= count; i++)
+ {
+ if (i == page)
+ {
+ navigation += "<td width=25 align=center valign=top><button value=\"[" + i + "]\" action=\"bypass -h voice .dressme-weapon " + i + "\" width=32 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>";
+ }
+ else
+ {
+ navigation += "<td width=25 align=center valign=top><button value=\"" + i + "\" action=\"bypass -h voice .dressme-weapon " + i + "\" width=32 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>";
+ }
+
+ if (inline == 7)
+ {
+ navigation += "</tr><tr>";
+ inline = 0;
+ }
+ inline++;
+ }
+
+ if (navigation.equals(""))
+ {
+ navigation = "<td width=30 align=center valign=top>...</td>";
+ }
+
+ html = html.replace("{list}", list);
+ html = html.replace("{navigation}", navigation);
+
+ sendHtml(player, html);
+ return true;
+ }
+ else if (command.equals("dressme-hat"))
+ {
+ L2ItemInstance slot = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_HAIR);
+ if (slot == null)
+ {
+ slot = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_HAIR2);
+ }
+
+ if (slot == null)
+ {
+ player.sendMessage("Error: Hat must be equiped!");
+ return false;
+ }
+
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), index_hat_path);
+ String template = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), template_hat_path);
+ String block = "";
+ String list = "";
+
+ if (args == null)
+ {
+ args = "1";
+ }
+
+ String[] param = args.split(" ");
+
+ final int page = param[0].length() > 0 ? Integer.parseInt(param[0]) : 1;
+ final int perpage = 5;
+ int counter = 0;
+
+ Map<Integer, DressMeHatData> map = DressMeHandler.initHatMap(new HashMap<>(), slot);
+ if (map == null)
+ {
+ _log.error("Dress me system: Hat Map is null.");
+ return false;
+ }
+
+ for (int i = (page - 1) * perpage; i < map.size(); i++)
+ {
+ DressMeHatData hat = map.get(i + 1);
+ if (hat != null)
+ {
+ block = template;
+
+ String hat_name = hat.getName();
+
+ if (hat_name.length() > 29)
+ {
+ hat_name = hat_name.substring(0, 29) + "...";
+ }
+
+ block = block.replace("{bypass}", "bypass -h voice .dress-hatpage " + hat.getId());
+ block = block.replace("{name}", hat_name);
+ block = block.replace("{price}", Util.formatPay(player, hat.getPriceCount(), hat.getPriceId()));
+ block = block.replace("{icon}", Util.getItemIcon(hat.getHatId()));
+ list += block;
+ }
+
+ counter++;
+
+ if (counter >= perpage)
+ {
+ break;
+ }
+ }
+
+ double count = Math.ceil((double) map.size() / perpage);
+ int inline = 1;
+ String navigation = "";
+
+ for (int i = 1; i <= count; i++)
+ {
+ if (i == page)
+ {
+ navigation += "<td width=25 align=center valign=top><button value=\"[" + i + "]\" action=\"bypass -h voice .dressme-hat " + i + "\" width=32 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>";
+ }
+ else
+ {
+ navigation += "<td width=25 align=center valign=top><button value=\"" + i + "\" action=\"bypass -h voice .dressme-hat " + i + "\" width=32 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>";
+ }
+
+ if (inline == 7)
+ {
+ navigation += "</tr><tr>";
+ inline = 0;
+ }
+ inline++;
+ }
+
+ if (navigation.equals(""))
+ {
+ navigation = "<td width=30 align=center valign=top>...</td>";
+ }
+
+ html = html.replace("{list}", list);
+ html = html.replace("{navigation}", navigation);
+
+ sendHtml(player, html);
+ return true;
+ }
+ else if (command.equals("dress-armorpage"))
+ {
+ final int set = Integer.parseInt(args.split(" ")[0]);
+ DressMeArmorData dress = DressMeArmorHolder.getInstance().getArmor(set);
+ if (dress != null)
+ {
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), dress_armor_path);
+
+ Inventory inv = player.getInventory();
+
+ L2ItemInstance my_chest = inv.getPaperdollItem(Inventory.PAPERDOLL_CHEST);
+ html = html.replace("{my_chest_icon}", my_chest == null ? "icon.NOIMAGE" : my_chest.getItem().getIcon());
+ L2ItemInstance my_legs = inv.getPaperdollItem(Inventory.PAPERDOLL_LEGS);
+ html = html.replace("{my_legs_icon}", my_legs == null ? "icon.NOIMAGE" : my_legs.getItem().getIcon());
+ L2ItemInstance my_gloves = inv.getPaperdollItem(Inventory.PAPERDOLL_GLOVES);
+ html = html.replace("{my_gloves_icon}", my_gloves == null ? "icon.NOIMAGE" : my_gloves.getItem().getIcon());
+ L2ItemInstance my_feet = inv.getPaperdollItem(Inventory.PAPERDOLL_FEET);
+ html = html.replace("{my_feet_icon}", my_feet == null ? "icon.NOIMAGE" : my_feet.getItem().getIcon());
+
+ html = html.replace("{bypass}", "bypass -h voice .dress-armor " + set);
+ html = html.replace("{name}", dress.getName());
+ html = html.replace("{price}", Util.formatPay(player, dress.getPriceCount(), dress.getPriceId()));
+
+ L2Item chest = ItemData.getInstance().getTemplate(dress.getChest());
+ html = html.replace("{chest_icon}", chest.getIcon());
+ html = html.replace("{chest_name}", chest.getName());
+ html = html.replace("{chest_grade}", chest.getItemGrade().name());
+
+ if (dress.getLegs() != -1)
+ {
+ L2Item legs = ItemData.getInstance().getTemplate(dress.getLegs());
+ html = html.replace("{legs_icon}", legs.getIcon());
+ html = html.replace("{legs_name}", legs.getName());
+ html = html.replace("{legs_grade}", legs.getItemGrade().name());
+ }
+ else
+ {
+ html = html.replace("{legs_icon}", "icon.NOIMAGE");
+ html = html.replace("{legs_name}", "<font color=FF0000>...</font>");
+ html = html.replace("{legs_grade}", "NO");
+ }
+
+ L2Item gloves = ItemData.getInstance().getTemplate(dress.getGloves());
+ html = html.replace("{gloves_icon}", gloves.getIcon());
+ html = html.replace("{gloves_name}", gloves.getName());
+ html = html.replace("{gloves_grade}", gloves.getItemGrade().name());
+
+ L2Item feet = ItemData.getInstance().getTemplate(dress.getFeet());
+ html = html.replace("{feet_icon}", feet.getIcon());
+ html = html.replace("{feet_name}", feet.getName());
+ html = html.replace("{feet_grade}", feet.getItemGrade().name());
+
+ sendHtml(player, html);
+ return true;
+ }
+ return false;
+ }
+ else if (command.equals("dress-cloakpage"))
+ {
+ final int set = Integer.parseInt(args.split(" ")[0]);
+ DressMeCloakData cloak = DressMeCloakHolder.getInstance().getCloak(set);
+ if (cloak != null)
+ {
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), dress_cloak_path);
+
+ Inventory inv = player.getInventory();
+ L2ItemInstance my_cloak = inv.getPaperdollItem(Inventory.PAPERDOLL_CLOAK);
+ html = html.replace("{my_cloak_icon}", my_cloak == null ? "icon.NOIMAGE" : my_cloak.getItem().getIcon());
+
+ html = html.replace("{bypass}", "bypass -h voice .dress-cloak " + cloak.getId());
+ html = html.replace("{name}", cloak.getName());
+ html = html.replace("{price}", Util.formatPay(player, cloak.getPriceCount(), cloak.getPriceId()));
+
+ L2Item item = ItemData.getInstance().getTemplate(cloak.getCloakId());
+ html = html.replace("{item_icon}", item.getIcon());
+ html = html.replace("{item_name}", item.getName());
+ html = html.replace("{item_grade}", item.getItemGrade().name());
+
+ sendHtml(player, html);
+ return true;
+ }
+ return false;
+ }
+ else if (command.equals("dress-shieldpage"))
+ {
+ final int set = Integer.parseInt(args.split(" ")[0]);
+ DressMeShieldData shield = DressMeShieldHolder.getInstance().getShield(set);
+ if (shield != null)
+ {
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), dress_shield_path);
+
+ Inventory inv = player.getInventory();
+ L2ItemInstance my_shield = inv.getPaperdollItem(Inventory.PAPERDOLL_LHAND);
+ html = html.replace("{my_shield_icon}", my_shield == null ? "icon.NOIMAGE" : my_shield.getItem().getIcon());
+
+ html = html.replace("{bypass}", "bypass -h voice .dress-shield " + shield.getId());
+ html = html.replace("{name}", shield.getName());
+ html = html.replace("{price}", Util.formatPay(player, shield.getPriceCount(), shield.getPriceId()));
+
+ L2Item item = ItemData.getInstance().getTemplate(shield.getShieldId());
+ html = html.replace("{item_icon}", item.getIcon());
+ html = html.replace("{item_name}", item.getName());
+ html = html.replace("{item_grade}", item.getItemGrade().name());
+
+ sendHtml(player, html);
+ return true;
+ }
+ return false;
+ }
+ else if (command.equals("dress-weaponpage"))
+ {
+ final int set = Integer.parseInt(args.split(" ")[0]);
+ DressMeWeaponData weapon = DressMeWeaponHolder.getInstance().getWeapon(set);
+ if (weapon != null)
+ {
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), dress_weapon_path);
+
+ Inventory inv = player.getInventory();
+ L2ItemInstance my_weapon = inv.getPaperdollItem(Inventory.PAPERDOLL_RHAND);
+ html = html.replace("{my_weapon_icon}", my_weapon == null ? "icon.NOIMAGE" : my_weapon.getItem().getIcon());
+
+ html = html.replace("{bypass}", "bypass -h voice .dress-weapon " + weapon.getId());
+ html = html.replace("{name}", weapon.getName());
+ html = html.replace("{price}", Util.formatPay(player, weapon.getPriceCount(), weapon.getPriceId()));
+
+ L2Item item = ItemData.getInstance().getTemplate(weapon.getId());
+ html = html.replace("{item_icon}", item.getIcon());
+ html = html.replace("{item_name}", item.getName());
+ html = html.replace("{item_grade}", item.getItemGrade().name());
+
+ sendHtml(player, html);
+ return true;
+ }
+ return false;
+ }
+ else if (command.equals("dress-hatpage"))
+ {
+ final int set = Integer.parseInt(args.split(" ")[0]);
+ DressMeHatData hat = DressMeHatHolder.getInstance().getHat(set);
+ if (hat != null)
+ {
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), dress_hat_path);
+
+ Inventory inv = player.getInventory();
+
+ L2ItemInstance my_hat = null;
+ switch (hat.getSlot())
+ {
+ case 1: // HAIR
+ case 3: // FULL HAIR
+ my_hat = inv.getPaperdollItem(Inventory.PAPERDOLL_HAIR);
+ break;
+ case 2: // HAIR2
+ my_hat = inv.getPaperdollItem(Inventory.PAPERDOLL_HAIR2);
+ break;
+ }
+
+ html = html.replace("{my_hat_icon}", my_hat == null ? "icon.NOIMAGE" : my_hat.getItem().getIcon());
+
+ html = html.replace("{bypass}", "bypass -h voice .dress-hat " + hat.getId());
+ html = html.replace("{name}", hat.getName());
+ html = html.replace("{price}", Util.formatPay(player, hat.getPriceCount(), hat.getPriceId()));
+
+ L2Item item = ItemData.getInstance().getTemplate(hat.getHatId());
+ html = html.replace("{item_icon}", item.getIcon());
+ html = html.replace("{item_name}", item.getName());
+ html = html.replace("{item_grade}", item.getItemGrade().name());
+
+ sendHtml(player, html);
+ return true;
+ }
+ return false;
+ }
+ else if (command.equals("dressinfo"))
+ {
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), info_path);
+ sendHtml(player, html);
+ return true;
+ }
+ else if (command.equals("dress-armor"))
+ {
+ final int set = Integer.parseInt(args.split(" ")[0]);
+
+ DressMeArmorData dress = DressMeArmorHolder.getInstance().getArmor(set);
+ Inventory inv = player.getInventory();
+
+ L2ItemInstance chest = inv.getPaperdollItem(Inventory.PAPERDOLL_CHEST);
+ L2ItemInstance legs = inv.getPaperdollItem(Inventory.PAPERDOLL_LEGS);
+ L2ItemInstance gloves = inv.getPaperdollItem(Inventory.PAPERDOLL_GLOVES);
+ L2ItemInstance feet = inv.getPaperdollItem(Inventory.PAPERDOLL_FEET);
+
+ if (chest == null)
+ {
+ player.sendMessage("Error: Chest must be equiped.");
+ useVoicedCommand("dress-armorpage", player, args);
+ return false;
+ }
+
+ if (chest.getItem().getBodyPart() == L2Item.SLOT_FULL_ARMOR)
+ {
+ L2Item visual = ItemData.getInstance().getTemplate(dress.getChest());
+ if (chest.getItem().getBodyPart() != visual.getBodyPart())
+ {
+ player.sendMessage("Error: You can't change visual in full armor type not full armors.");
+ useVoicedCommand("dress-armorpage", player, args);
+ return false;
+ }
+ }
+
+ // Checks for armor set for the equipped chest.
+ if (!ArmorSetsData.getInstance().isArmorSet(chest.getId()))
+ {
+ player.sendMessage("Error: You can't visualize current set.");
+ useVoicedCommand("dress-armorpage", player, args);
+ return false;
+ }
+
+ L2ArmorSet armoSet = ArmorSetsData.getInstance().getSet(chest.getId());
+ if ((armoSet == null) || !armoSet.containAll(player))
+ {
+ player.sendMessage("Error: You can't visualize, set is not complete.");
+ useVoicedCommand("dress-armorpage", player, args);
+ return false;
+ }
+
+ if (!chest.getArmorItem().getItemType().getDescription().equals(dress.getType()))
+ {
+ player.sendMessage("Error: You can't visualize current set.");
+ useVoicedCommand("dress-armorpage", player, args);
+ return false;
+ }
+
+ if (Conditions.checkPlayerItemCount(player, dress.getPriceId(), dress.getPriceCount()))
+ {
+ player.destroyItemByItemId("VisualChange", dress.getPriceId(), dress.getPriceCount(), player, true);
+ DressMeHandler.visuality(player, chest, dress.getChest());
+
+ if (dress.getLegs() != -1)
+ {
+ DressMeHandler.visuality(player, legs, dress.getLegs());
+ }
+ else if ((dress.getLegs() == -1) && (chest.getItem().getBodyPart() != L2Item.SLOT_FULL_ARMOR))
+ {
+ DressMeHandler.visuality(player, legs, dress.getChest());
+ }
+
+ DressMeHandler.visuality(player, gloves, dress.getGloves());
+ DressMeHandler.visuality(player, feet, dress.getFeet());
+ player.broadcastUserInfo();
+ }
+ useVoicedCommand("dressme", player, null);
+ return true;
+ }
+ else if (command.equals("dress-cloak"))
+ {
+ final int set = Integer.parseInt(args.split(" ")[0]);
+
+ DressMeCloakData cloak_data = DressMeCloakHolder.getInstance().getCloak(set);
+ Inventory inv = player.getInventory();
+
+ L2ItemInstance cloak = inv.getPaperdollItem(Inventory.PAPERDOLL_CLOAK);
+
+ if (cloak == null)
+ {
+ player.sendMessage("Error: Cloak must be equiped.");
+ useVoicedCommand("dress-cloakpage", player, args);
+ return false;
+ }
+
+ if (Conditions.checkPlayerItemCount(player, cloak_data.getPriceId(), cloak_data.getPriceCount()))
+ {
+ player.destroyItemByItemId("VisualChange", cloak_data.getPriceId(), cloak_data.getPriceCount(), player, true);
+ DressMeHandler.visuality(player, cloak, cloak_data.getCloakId());
+ }
+ player.broadcastUserInfo();
+ useVoicedCommand("dressme", player, null);
+ return true;
+ }
+ else if (command.equals("dress-shield"))
+ {
+ final int shield_id = Integer.parseInt(args.split(" ")[0]);
+
+ DressMeShieldData shield_data = DressMeShieldHolder.getInstance().getShield(shield_id);
+ Inventory inv = player.getInventory();
+
+ L2ItemInstance shield = inv.getPaperdollItem(Inventory.PAPERDOLL_LHAND);
+
+ if (shield == null)
+ {
+ player.sendMessage("Error: Shield must be equiped.");
+ useVoicedCommand("dress-shieldpage", player, args);
+ return false;
+ }
+
+ if (Conditions.checkPlayerItemCount(player, shield_data.getPriceId(), shield_data.getPriceCount()))
+ {
+ player.destroyItemByItemId("VisualChange", shield_data.getPriceId(), shield_data.getPriceCount(), player, true);
+ DressMeHandler.visuality(player, shield, shield_data.getShieldId());
+ }
+ player.broadcastUserInfo();
+ useVoicedCommand("dressme", player, null);
+ return true;
+ }
+ else if (command.equals("dress-weapon"))
+ {
+ final int set = Integer.parseInt(args.split(" ")[0]);
+
+ DressMeWeaponData weapon_data = DressMeWeaponHolder.getInstance().getWeapon(set);
+ Inventory inv = player.getInventory();
+
+ L2ItemInstance weapon = inv.getPaperdollItem(Inventory.PAPERDOLL_RHAND);
+
+ if (weapon == null)
+ {
+ player.sendMessage("Error: Weapon must be equiped.");
+ useVoicedCommand("dress-weaponpage", player, args);
+ return false;
+ }
+
+ if (!weapon.getItemType().toString().equals(weapon_data.getType()))
+ {
+ player.sendMessage("Error: Weapon must be equals type.");
+ useVoicedCommand("dressme-weapon", player, null);
+ return false;
+ }
+
+ if (Conditions.checkPlayerItemCount(player, weapon_data.getPriceId(), weapon_data.getPriceCount()))
+ {
+ player.destroyItemByItemId("VisualChange", weapon_data.getPriceId(), weapon_data.getPriceCount(), player, true);
+ DressMeHandler.visuality(player, weapon, weapon_data.getId());
+ }
+ player.broadcastUserInfo();
+ useVoicedCommand("dressme", player, null);
+ return true;
+ }
+ else if (command.equals("dress-hat"))
+ {
+ final int set = Integer.parseInt(args.split(" ")[0]);
+
+ DressMeHatData hat_data = DressMeHatHolder.getInstance().getHat(set);
+ Inventory inv = player.getInventory();
+
+ L2ItemInstance hat = null;
+ switch (hat_data.getSlot())
+ {
+ case 1: // HAIR
+ case 3: // FULL HAIR
+ hat = inv.getPaperdollItem(Inventory.PAPERDOLL_HAIR);
+ break;
+ case 2: // HAIR2
+ hat = inv.getPaperdollItem(Inventory.PAPERDOLL_HAIR2);
+ break;
+ }
+
+ if (hat == null)
+ {
+ player.sendMessage("Error: Hat must be equiped.");
+ useVoicedCommand("dress-hatpage", player, args);
+ return false;
+ }
+
+ L2Item visual = ItemData.getInstance().getTemplate(hat_data.getHatId());
+ if (hat.getItem().getBodyPart() != visual.getBodyPart())
+ {
+ player.sendMessage("Error: You can't change visual on different hat types!");
+ useVoicedCommand("dress-hatpage", player, args);
+ return false;
+ }
+
+ if (Conditions.checkPlayerItemCount(player, hat_data.getPriceId(), hat_data.getPriceCount()))
+ {
+ player.destroyItemByItemId("VisualChange", hat_data.getPriceId(), hat_data.getPriceCount(), player, true);
+ DressMeHandler.visuality(player, hat, hat_data.getHatId());
+ }
+ player.broadcastUserInfo();
+ useVoicedCommand("dressme", player, null);
+ return true;
+ }
+ else if (command.equals("undressme"))
+ {
+ String html = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), undressme_path);
+ html = html.replace("<?show_hide?>", !player.getVarB("showVisualChange") ? "Show visual equip on other player!" : "Hide visual equip on other player!");
+ html = html.replace("<?show_hide_b?>", !player.getVarB("showVisualChange") ? "showdress" : "hidedress");
+
+ sendHtml(player, html);
+ return true;
+ }
+ else if (command.equals("undressme-armor"))
+ {
+ Inventory inv = player.getInventory();
+ L2ItemInstance chest = inv.getPaperdollItem(Inventory.PAPERDOLL_CHEST);
+ L2ItemInstance legs = inv.getPaperdollItem(Inventory.PAPERDOLL_LEGS);
+ L2ItemInstance gloves = inv.getPaperdollItem(Inventory.PAPERDOLL_GLOVES);
+ L2ItemInstance feet = inv.getPaperdollItem(Inventory.PAPERDOLL_FEET);
+
+ if (chest != null)
+ {
+ DressMeHandler.visuality(player, chest, 0);
+ }
+ if (legs != null)
+ {
+ DressMeHandler.visuality(player, legs, 0);
+ }
+ if (gloves != null)
+ {
+ DressMeHandler.visuality(player, gloves, 0);
+ }
+ if (feet != null)
+ {
+ DressMeHandler.visuality(player, feet, 0);
+ }
+
+ player.broadcastUserInfo();
+ useVoicedCommand("undressme", player, null);
+ return true;
+ }
+ else if (command.equals("undressme-cloak"))
+ {
+ L2ItemInstance cloak = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CLOAK);
+ if (cloak != null)
+ {
+ DressMeHandler.visuality(player, cloak, 0);
+ }
+ player.broadcastUserInfo();
+ useVoicedCommand("undressme", player, null);
+ return true;
+ }
+ else if (command.equals("undressme-shield"))
+ {
+ L2ItemInstance shield = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND);
+ if (shield != null)
+ {
+ DressMeHandler.visuality(player, shield, 0);
+ }
+ player.broadcastUserInfo();
+ useVoicedCommand("undressme", player, null);
+ return true;
+ }
+ else if (command.equals("undressme-weapon"))
+ {
+ L2ItemInstance weapon = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
+ if (weapon != null)
+ {
+ DressMeHandler.visuality(player, weapon, 0);
+ }
+ player.broadcastUserInfo();
+ useVoicedCommand("undressme", player, null);
+ return true;
+ }
+ else if (command.equals("undressme-hat"))
+ {
+ L2ItemInstance slot = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_HAIR);
+ if (slot == null)
+ {
+ slot = player.getInventory().getPaperdollItem(Inventory.PAPERDOLL_HAIR2);
+ }
+
+ if (slot != null)
+ {
+ DressMeHandler.visuality(player, slot, 0);
+ }
+ player.broadcastUserInfo();
+ useVoicedCommand("undressme", player, null);
+ return true;
+ }
+ else if (command.equals("showdress"))
+ {
+ player.setVar("showVisualChange", "true");
+ player.broadcastUserInfo();
+ useVoicedCommand("dressme", player, null);
+ return true;
+ }
+ else if (command.equals("hidedress"))
+ {
+ player.setVar("showVisualChange", "false");
+ player.broadcastUserInfo();
+ useVoicedCommand("dressme", player, null);
+ return true;
+ }
+
+ return false;
+ }
+
+ private void sendHtml(L2PcInstance player, String html)
+ {
+ NpcHtmlMessage msg = new NpcHtmlMessage();
+ msg.setHtml(html);
+ player.sendPacket(msg);
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return _commandList;
+ }
+}
Index: java/gr/sr/dressmeEngine/xml/dataHolder/DressMeHatHolder.java
===================================================================
--- java/gr/sr/dressmeEngine/xml/dataHolder/DressMeHatHolder.java (revision 0)
+++ java/gr/sr/dressmeEngine/xml/dataHolder/DressMeHatHolder.java (working copy)
@@ -0,0 +1,54 @@
+package gr.sr.dressmeEngine.xml.dataHolder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import gr.sr.data.xml.AbstractHolder;
+import gr.sr.dressmeEngine.data.DressMeHatData;
+
+public final class DressMeHatHolder extends AbstractHolder
+{
+ private static final DressMeHatHolder _instance = new DressMeHatHolder();
+
+ public static DressMeHatHolder getInstance()
+ {
+ return _instance;
+ }
+
+ private final List<DressMeHatData> _hat = new ArrayList<>();
+
+ public void addHat(DressMeHatData hat)
+ {
+ _hat.add(hat);
+ }
+
+ public List<DressMeHatData> getAllHats()
+ {
+ return _hat;
+ }
+
+ public DressMeHatData getHat(int id)
+ {
+ for (DressMeHatData hat : _hat)
+ {
+ if (hat.getId() == id)
+ {
+ return hat;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public int size()
+ {
+ return _hat.size();
+ }
+
+ @Override
+ public void clear()
+ {
+ _hat.clear();
+ }
+}
Index: java/l2r/gameserver/model/items/instance/L2ItemInstance.java
===================================================================
--- java/l2r/gameserver/model/items/instance/L2ItemInstance.java (revision 232)
+++ java/l2r/gameserver/model/items/instance/L2ItemInstance.java (working copy)
@@ -1495,6 +1495,8 @@
  int objectId, item_id, loc_data, enchant_level, custom_type1, custom_type2, manaLeft;
  long time, count;
  ItemLocation loc;
+
+ int visualItemId;
  try
  {
  objectId = rs.getInt(1);
@@ -1507,6 +1509,7 @@
  custom_type2 = rs.getInt("custom_type2");
  manaLeft = rs.getInt("mana_left");
  time = rs.getLong("time");
+ visualItemId = rs.getInt("visual_item_id");
  }
  catch (Exception e)
  {
@@ -1534,6 +1537,9 @@
  inst._mana = manaLeft;
  inst._time = time;
 
+ // Set visual item id for dress me
+ inst.visualItemId = visualItemId;
+
  // load augmentation and elemental enchant
  if (inst.isEquipable())
  {
@@ -1646,7 +1652,7 @@
  }
 
  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=? " + "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=?,visual_item_id=? " + "WHERE object_id = ?"))
  {
  ps.setInt(1, _ownerId);
  ps.setLong(2, getCount());
@@ -1657,7 +1663,8 @@
  ps.setInt(7, getCustomType2());
  ps.setInt(8, getMana());
  ps.setLong(9, getTime());
- ps.setInt(10, getObjectId());
+ ps.setInt(10, getVisualItemId());
+ ps.setInt(11, getObjectId());
  ps.executeUpdate();
  _existsInDb = true;
  _storedInDb = true;
@@ -1684,7 +1691,7 @@
  }
 
  try (Connection con = L2DatabaseFactory.getInstance().getConnection();
- PreparedStatement ps = con.prepareStatement("INSERT INTO items (owner_id,item_id,count,loc,loc_data,enchant_level,object_id,custom_type1,custom_type2,mana_left,time) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?)"))
+ PreparedStatement ps = con.prepareStatement("INSERT INTO items (owner_id,item_id,count,loc,loc_data,enchant_level,object_id,custom_type1,custom_type2,mana_left,time,visual_item_id) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"))
  {
  ps.setInt(1, _ownerId);
  ps.setInt(2, _itemId);
@@ -1697,6 +1704,7 @@
  ps.setInt(9, _type2);
  ps.setInt(10, getMana());
  ps.setLong(11, getTime());
+ ps.setInt(12, getVisualItemId());
 
  ps.executeUpdate();
  _existsInDb = true;
@@ -2247,4 +2255,17 @@
  _lifeTimeTask = null;
  }
  }
+
+ // Used for dress me engine
+ private int visualItemId = 0;
+
+ public int getVisualItemId()
+ {
+ return visualItemId;
+ }
+
+ public void setVisualItemId(int visualItemId)
+ {
+ this.visualItemId = visualItemId;
+ }
 }
Index: java/gr/sr/dressmeEngine/data/DressMeHatData.java
===================================================================
--- java/gr/sr/dressmeEngine/data/DressMeHatData.java (revision 0)
+++ java/gr/sr/dressmeEngine/data/DressMeHatData.java (working copy)
@@ -0,0 +1,51 @@
+package gr.sr.dressmeEngine.data;
+
+public class DressMeHatData
+{
+ private final int _id;
+ private final int _hat;
+ private final String _name;
+ private final int _slot;
+ private final int _priceId;
+ private final long _priceCount;
+
+ public DressMeHatData(int id, int hat, String name, int slot, int priceId, long priceCount)
+ {
+ _id = id;
+ _hat = hat;
+ _name = name;
+ _slot = slot;
+ _priceId = priceId;
+ _priceCount = priceCount;
+ }
+
+ public int getId()
+ {
+ return _id;
+ }
+
+ public int getHatId()
+ {
+ return _hat;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public int getSlot()
+ {
+ return _slot;
+ }
+
+ public int getPriceId()
+ {
+ return _priceId;
+ }
+
+ public long getPriceCount()
+ {
+ return _priceCount;
+ }
+}
Index: java/gr/sr/dressmeEngine/data/DressMeArmorData.java
===================================================================
--- java/gr/sr/dressmeEngine/data/DressMeArmorData.java (revision 0)
+++ java/gr/sr/dressmeEngine/data/DressMeArmorData.java (working copy)
@@ -0,0 +1,72 @@
+package gr.sr.dressmeEngine.data;
+
+public class DressMeArmorData
+{
+ private final int _id;
+ private final String _name;
+ private final String _type;
+ private final int _chest;
+ private final int _legs;
+ private final int _gloves;
+ private final int _feet;
+ private final int _priceId;
+ private final long _priceCount;
+
+ public DressMeArmorData(int id, String name, String type, int chest, int legs, int gloves, int feet, int priceId, long priceCount)
+ {
+ _id = id;
+ _name = name;
+ _type = type;
+ _chest = chest;
+ _legs = legs;
+ _gloves = gloves;
+ _feet = feet;
+ _priceId = priceId;
+ _priceCount = priceCount;
+ }
+
+ public int getId()
+ {
+ return _id;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public String getType()
+ {
+ return _type;
+ }
+
+ public int getChest()
+ {
+ return _chest;
+ }
+
+ public int getLegs()
+ {
+ return _legs;
+ }
+
+ public int getGloves()
+ {
+ return _gloves;
+ }
+
+ public int getFeet()
+ {
+ return _feet;
+ }
+
+ public int getPriceId()
+ {
+ return _priceId;
+ }
+
+ public long getPriceCount()
+ {
+ return _priceCount;
+ }
+}
Index: java/l2r/gameserver/model/items/type/ArmorType.java
===================================================================
--- java/l2r/gameserver/model/items/type/ArmorType.java (revision 232)
+++ java/l2r/gameserver/model/items/type/ArmorType.java (working copy)
@@ -23,23 +23,26 @@
  */
 public enum ArmorType implements ItemType
 {
- NONE,
- LIGHT,
- HEAVY,
- MAGIC,
- SIGIL,
+ NONE("NONE"),
+ LIGHT("LIGHT"),
+ HEAVY("HEAVY"),
+ MAGIC("ROBE"),
+ SIGIL("SIGIL"),
 
  // L2J CUSTOM
- SHIELD;
+ SHIELD("SHIELD");
 
  final int _mask;
+ private final String _descr;
 
  /**
  * Constructor of the ArmorType.
+ * @param descr
  */
- private ArmorType()
+ private ArmorType(String descr)
  {
  _mask = 1 << (ordinal() + WeaponType.values().length);
+ _descr = descr;
  }
 
  /**
@@ -50,4 +53,9 @@
  {
  return _mask;
  }
+
+ public String getDescription()
+ {
+ return _descr;
+ }
 }
Index: java/l2r/gameserver/model/itemcontainer/ItemContainer.java
===================================================================
--- java/l2r/gameserver/model/itemcontainer/ItemContainer.java (revision 232)
+++ java/l2r/gameserver/model/itemcontainer/ItemContainer.java (working copy)
@@ -645,7 +645,7 @@
  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 FROM items WHERE owner_id=? AND (loc=?)"))
+ PreparedStatement statement = con.prepareStatement("SELECT object_id, item_id, count, enchant_level, loc, loc_data, custom_type1, custom_type2, mana_left, time, visual_item_id FROM items WHERE owner_id=? AND (loc=?)"))
  {
  statement.setInt(1, getOwnerId());
  statement.setString(2, getBaseLocation().name());
Index: java/gr/sr/dressmeEngine/data/DressMeWeaponData.java
===================================================================
--- java/gr/sr/dressmeEngine/data/DressMeWeaponData.java (revision 0)
+++ java/gr/sr/dressmeEngine/data/DressMeWeaponData.java (working copy)
@@ -0,0 +1,51 @@
+package gr.sr.dressmeEngine.data;
+
+public class DressMeWeaponData
+{
+ private final int _id;
+ private final String _name;
+ private final String _type;
+ private final boolean _isBig;
+ private final int _priceId;
+ private final long _priceCount;
+
+ public DressMeWeaponData(int id, String name, String type, boolean isBig, int priceId, long priceCount)
+ {
+ _id = id;
+ _name = name;
+ _type = type;
+ _isBig = isBig;
+ _priceId = priceId;
+ _priceCount = priceCount;
+ }
+
+ public int getId()
+ {
+ return _id;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public String getType()
+ {
+ return _type;
+ }
+
+ public boolean isBig()
+ {
+ return _isBig;
+ }
+
+ public int getPriceId()
+ {
+ return _priceId;
+ }
+
+ public long getPriceCount()
+ {
+ return _priceCount;
+ }
+}
Index: java/gr/sr/dressmeEngine/data/DressMeShieldData.java
===================================================================
--- java/gr/sr/dressmeEngine/data/DressMeShieldData.java (revision 0)
+++ java/gr/sr/dressmeEngine/data/DressMeShieldData.java (working copy)
@@ -0,0 +1,44 @@
+package gr.sr.dressmeEngine.data;
+
+public class DressMeShieldData
+{
+ private final int _id;
+ private final int _shield;
+ private final String _name;
+ private final int _priceId;
+ private final long _priceCount;
+
+ public DressMeShieldData(int id, int shield, String name, int priceId, long priceCount)
+ {
+ _id = id;
+ _shield = shield;
+ _name = name;
+ _priceId = priceId;
+ _priceCount = priceCount;
+ }
+
+ public int getId()
+ {
+ return _id;
+ }
+
+ public int getShieldId()
+ {
+ return _shield;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public int getPriceId()
+ {
+ return _priceId;
+ }
+
+ public long getPriceCount()
+ {
+ return _priceCount;
+ }
+}
Index: java/gr/sr/dressmeEngine/xml/dataHolder/DressMeShieldHolder.java
===================================================================
--- java/gr/sr/dressmeEngine/xml/dataHolder/DressMeShieldHolder.java (revision 0)
+++ java/gr/sr/dressmeEngine/xml/dataHolder/DressMeShieldHolder.java (working copy)
@@ -0,0 +1,54 @@
+package gr.sr.dressmeEngine.xml.dataHolder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import gr.sr.data.xml.AbstractHolder;
+import gr.sr.dressmeEngine.data.DressMeShieldData;
+
+public final class DressMeShieldHolder extends AbstractHolder
+{
+ private static final DressMeShieldHolder _instance = new DressMeShieldHolder();
+
+ public static DressMeShieldHolder getInstance()
+ {
+ return _instance;
+ }
+
+ private final List<DressMeShieldData> _shield = new ArrayList<>();
+
+ public void addShield(DressMeShieldData shield)
+ {
+ _shield.add(shield);
+ }
+
+ public List<DressMeShieldData> getAllShields()
+ {
+ return _shield;
+ }
+
+ public DressMeShieldData getShield(int id)
+ {
+ for (DressMeShieldData shield : _shield)
+ {
+ if (shield.getId() == id)
+ {
+ return shield;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public int size()
+ {
+ return _shield.size();
+ }
+
+ @Override
+ public void clear()
+ {
+ _shield.clear();
+ }
+}
Index: java/gr/sr/dressmeEngine/xml/dataParser/DressMeHatParser.java
===================================================================
--- java/gr/sr/dressmeEngine/xml/dataParser/DressMeHatParser.java (revision 0)
+++ java/gr/sr/dressmeEngine/xml/dataParser/DressMeHatParser.java (working copy)
@@ -0,0 +1,91 @@
+package gr.sr.dressmeEngine.xml.dataParser;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import l2r.Config;
+
+import gr.sr.data.xml.AbstractFileParser;
+import gr.sr.dressmeEngine.data.DressMeHatData;
+import gr.sr.dressmeEngine.xml.dataHolder.DressMeHatHolder;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+
+public final class DressMeHatParser extends AbstractFileParser<DressMeHatHolder>
+{
+ private final String CLOAK_FILE_PATH = Config.DATAPACK_ROOT + "/data/xml/sunrise/dressme/hat.xml";
+
+ private static final DressMeHatParser _instance = new DressMeHatParser();
+
+ public static DressMeHatParser getInstance()
+ {
+ return _instance;
+ }
+
+ private DressMeHatParser()
+ {
+ super(DressMeHatHolder.getInstance());
+ }
+
+ @Override
+ public File getXMLFile()
+ {
+ return new File(CLOAK_FILE_PATH);
+ }
+
+ @Override
+ protected void readData()
+ {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setValidating(false);
+ factory.setIgnoringComments(true);
+
+ File file = getXMLFile();
+
+ try
+ {
+ InputSource in = new InputSource(new InputStreamReader(new FileInputStream(file), "UTF-8"));
+ in.setEncoding("UTF-8");
+ Document doc = factory.newDocumentBuilder().parse(in);
+
+ for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+ {
+ if (n.getNodeName().equalsIgnoreCase("list"))
+ {
+ for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+ {
+ if (d.getNodeName().equalsIgnoreCase("hat"))
+ {
+ int number = Integer.parseInt(d.getAttributes().getNamedItem("number").getNodeValue());
+ int id = Integer.parseInt(d.getAttributes().getNamedItem("id").getNodeValue());
+ String name = d.getAttributes().getNamedItem("name").getNodeValue();
+ int slot = Integer.parseInt(d.getAttributes().getNamedItem("slot").getNodeValue());
+ int itemId = 0;
+ long itemCount = 0;
+
+ for (Node price = d.getFirstChild(); price != null; price = price.getNextSibling())
+ {
+ if ("price".equalsIgnoreCase(price.getNodeName()))
+ {
+ itemId = Integer.parseInt(price.getAttributes().getNamedItem("id").getNodeValue());
+ itemCount = Long.parseLong(price.getAttributes().getNamedItem("count").getNodeValue());
+ }
+ }
+
+ getHolder().addHat(new DressMeHatData(number, id, name, slot, itemId, itemCount));
+ }
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ _log.warn(getClass().getSimpleName() + ": Error: " + e);
+ }
+ }
+}
\ No newline at end of file
Index: java/gr/sr/dressmeEngine/DressMeHandler.java
===================================================================
--- java/gr/sr/dressmeEngine/DressMeHandler.java (revision 0)
+++ java/gr/sr/dressmeEngine/DressMeHandler.java (working copy)
@@ -0,0 +1,170 @@
+package gr.sr.dressmeEngine;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.util.Map;
+
+import l2r.Config;
+import l2r.L2DatabaseFactory;
+import l2r.gameserver.model.actor.instance.L2PcInstance;
+import l2r.gameserver.model.items.L2Item;
+import l2r.gameserver.model.items.instance.L2ItemInstance;
+
+import gr.sr.dressmeEngine.data.DressMeArmorData;
+import gr.sr.dressmeEngine.data.DressMeHatData;
+import gr.sr.dressmeEngine.data.DressMeWeaponData;
+import gr.sr.dressmeEngine.util.Util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DressMeHandler
+{
+ private static final Logger _log = LoggerFactory.getLogger(DressMeHandler.class);
+
+ public static void visuality(L2PcInstance player, L2ItemInstance item, int visual)
+ {
+ item.setVisualItemId(visual);
+ updateVisualInDb(item, visual);
+
+ if (visual > 0)
+ {
+ player.sendMessage(item.getName() + " visual change to " + Util.getItemName(visual));
+ }
+ else
+ {
+ player.sendMessage("Visual removed from " + item.getName() + ".");
+ }
+
+ player.broadcastUserInfo();
+ }
+
+ public static void updateVisualInDb(L2ItemInstance item, int visual)
+ {
+ try (Connection con = L2DatabaseFactory.getInstance().getConnection();
+ PreparedStatement ps = con.prepareStatement("UPDATE items SET visual_item_id=? " + "WHERE object_id = ?"))
+ {
+ ps.setInt(1, visual);
+ ps.setInt(2, item.getObjectId());
+ ps.executeUpdate();
+ }
+ catch (Exception e)
+ {
+ if (Config.DEBUG)
+ {
+ _log.error("Could not update dress me item in DB: Reason: " + e.getMessage(), e);
+ }
+ }
+ }
+
+ public static Map<Integer, DressMeWeaponData> initWeaponMap(String type, Map<Integer, DressMeWeaponData> map, L2ItemInstance slot)
+ {
+ if (type.equals("SWORD") && (slot.getItem().getBodyPart() != L2Item.SLOT_LR_HAND))
+ {
+ return map = DressMeLoader.SWORD;
+ }
+ else if (type.equals("BLUNT") && (slot.getItem().getBodyPart() != L2Item.SLOT_LR_HAND))
+ {
+ return map = DressMeLoader.BLUNT;
+ }
+ else if (type.equals("SWORD") && (slot.getItem().getBodyPart() == L2Item.SLOT_LR_HAND))
+ {
+ return map = DressMeLoader.BIGSWORD;
+ }
+ else if (type.equals("BLUNT") && (slot.getItem().getBodyPart() == L2Item.SLOT_LR_HAND))
+ {
+ return map = DressMeLoader.BIGBLUNT;
+ }
+ else if (type.equals("DAGGER"))
+ {
+ return map = DressMeLoader.DAGGER;
+ }
+ else if (type.equals("BOW"))
+ {
+ return map = DressMeLoader.BOW;
+ }
+ else if (type.equals("POLE"))
+ {
+ return map = DressMeLoader.POLE;
+ }
+ else if (type.equals("FIST"))
+ {
+ return map = DressMeLoader.FIST;
+ }
+ else if (type.equals("DUAL"))
+ {
+ return map = DressMeLoader.DUAL;
+ }
+ else if (type.equals("DUALFIST"))
+ {
+ return map = DressMeLoader.DUALFIST;
+ }
+ else if (type.equals("FISHINGROD"))
+ {
+ return map = DressMeLoader.ROD;
+ }
+ else if (type.equals("CROSSBOW"))
+ {
+ return map = DressMeLoader.CROSSBOW;
+ }
+ else if (type.equals("RAPIER"))
+ {
+ return map = DressMeLoader.RAPIER;
+ }
+ else if (type.equals("ANCIENTSWORD"))
+ {
+ return map = DressMeLoader.ANCIENTSWORD;
+ }
+ else if (type.equals("DUALDAGGER"))
+ {
+ return map = DressMeLoader.DUALDAGGER;
+ }
+ else
+ {
+ _log.error("Dress me system: Unknown weapon type: " + type);
+ return null;
+ }
+ }
+
+ public static Map<Integer, DressMeArmorData> initArmorMap(String type, Map<Integer, DressMeArmorData> map, L2ItemInstance slot)
+ {
+ if (type.equals("LIGHT"))
+ {
+ return map = DressMeLoader.LIGHT;
+ }
+ else if (type.equals("HEAVY"))
+ {
+ return map = DressMeLoader.HEAVY;
+ }
+ else if (type.equals("ROBE"))
+ {
+ return map = DressMeLoader.ROBE;
+ }
+ else
+ {
+ _log.error("Dress me system: Unknown armor type: " + type);
+ return null;
+ }
+ }
+
+ public static Map<Integer, DressMeHatData> initHatMap(Map<Integer, DressMeHatData> map, L2ItemInstance slot)
+ {
+ if ((slot.getLocationSlot() == 2) && (slot.getItem().getBodyPart() != L2Item.SLOT_HAIRALL))
+ {
+ return map = DressMeLoader.HAIR;
+ }
+ else if ((slot.getLocationSlot() == 2) && (slot.getItem().getBodyPart() == L2Item.SLOT_HAIRALL))
+ {
+ return map = DressMeLoader.HAIR_FULL;
+ }
+ else if (slot.getLocationSlot() == 3)
+ {
+ return map = DressMeLoader.HAIR2;
+ }
+ else
+ {
+ _log.error("Dress me system: Unknown hat slot: " + slot.getLocationSlot());
+ return null;
+ }
+ }
+}
Index: java/gr/sr/dressmeEngine/xml/dataHolder/DressMeWeaponHolder.java
===================================================================
--- java/gr/sr/dressmeEngine/xml/dataHolder/DressMeWeaponHolder.java (revision 0)
+++ java/gr/sr/dressmeEngine/xml/dataHolder/DressMeWeaponHolder.java (working copy)
@@ -0,0 +1,54 @@
+package gr.sr.dressmeEngine.xml.dataHolder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import gr.sr.data.xml.AbstractHolder;
+import gr.sr.dressmeEngine.data.DressMeWeaponData;
+
+public final class DressMeWeaponHolder extends AbstractHolder
+{
+ private static final DressMeWeaponHolder _instance = new DressMeWeaponHolder();
+
+ public static DressMeWeaponHolder getInstance()
+ {
+ return _instance;
+ }
+
+ private final List<DressMeWeaponData> _weapons = new ArrayList<>();
+
+ public void addWeapon(DressMeWeaponData weapon)
+ {
+ _weapons.add(weapon);
+ }
+
+ public List<DressMeWeaponData> getAllWeapons()
+ {
+ return _weapons;
+ }
+
+ public DressMeWeaponData getWeapon(int id)
+ {
+ for (DressMeWeaponData weapon : _weapons)
+ {
+ if (weapon.getId() == id)
+ {
+ return weapon;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public int size()
+ {
+ return _weapons.size();
+ }
+
+ @Override
+ public void clear()
+ {
+ _weapons.clear();
+ }
+}
Index: java/l2r/gameserver/model/itemcontainer/Inventory.java
===================================================================
--- java/l2r/gameserver/model/itemcontainer/Inventory.java (revision 232)
+++ java/l2r/gameserver/model/itemcontainer/Inventory.java (working copy)
@@ -70,6 +70,10 @@
  public static final int SKULL_ID = 41006;
  public static final int ANCIENT_ADENA_ID = 5575;
 
+ public static final int ITEM_ID_PC_BANG_POINTS = -100;
+ public static final int ITEM_ID_CLAN_REPUTATION_SCORE = -200;
+ public static final int ITEM_ID_FAME = -300;
+
  public static final long MAX_ADENA = Config.MAX_ADENA;
 
  public static final int PAPERDOLL_UNDER = 0;
@@ -1017,6 +1021,25 @@
  * @param slot : int designating the slot
  * @return int designating the ID of the item
  */
+ public int getPaperdollItemVisualDisplayId(int slot)
+ {
+ final L2ItemInstance item = _paperdoll[slot];
+ if (item != null)
+ {
+ if (item.getVisualItemId() > 0)
+ {
+ return item.getVisualItemId();
+ }
+ return item.getDisplayId();
+ }
+ return 0;
+ }
+
+ /**
+ * Returns the ID of the item in the paperdoll slot
+ * @param slot : int designating the slot
+ * @return int designating the ID of the item
+ */
  public int getPaperdollItemDisplayId(int slot)
  {
  final L2ItemInstance item = _paperdoll[slot];
@@ -1664,7 +1687,7 @@
  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 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, visual_item_id FROM items WHERE owner_id=? AND (loc=? OR loc=?) ORDER BY loc_data"))
  {
  statement.setInt(1, getOwnerId());
  statement.setString(2, getBaseLocation().name());
Index: java/gr/sr/dressmeEngine/xml/dataHolder/DressMeArmorHolder.java
===================================================================
--- java/gr/sr/dressmeEngine/xml/dataHolder/DressMeArmorHolder.java (revision 0)
+++ java/gr/sr/dressmeEngine/xml/dataHolder/DressMeArmorHolder.java (working copy)
@@ -0,0 +1,54 @@
+package gr.sr.dressmeEngine.xml.dataHolder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import gr.sr.data.xml.AbstractHolder;
+import gr.sr.dressmeEngine.data.DressMeArmorData;
+
+public final class DressMeArmorHolder extends AbstractHolder
+{
+ private static final DressMeArmorHolder _instance = new DressMeArmorHolder();
+
+ public static DressMeArmorHolder getInstance()
+ {
+ return _instance;
+ }
+
+ private final List<DressMeArmorData> _dress = new ArrayList<>();
+
+ public void addDress(DressMeArmorData armorset)
+ {
+ _dress.add(armorset);
+ }
+
+ public List<DressMeArmorData> getAllDress()
+ {
+ return _dress;
+ }
+
+ public DressMeArmorData getArmor(int id)
+ {
+ for (DressMeArmorData dress : _dress)
+ {
+ if (dress.getId() == id)
+ {
+ return dress;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public int size()
+ {
+ return _dress.size();
+ }
+
+ @Override
+ public void clear()
+ {
+ _dress.clear();
+ }
+}
Index: java/gr/sr/dressmeEngine/xml/dataHolder/DressMeCloakHolder.java
===================================================================
--- java/gr/sr/dressmeEngine/xml/dataHolder/DressMeCloakHolder.java (revision 0)
+++ java/gr/sr/dressmeEngine/xml/dataHolder/DressMeCloakHolder.java (working copy)
@@ -0,0 +1,54 @@
+package gr.sr.dressmeEngine.xml.dataHolder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import gr.sr.data.xml.AbstractHolder;
+import gr.sr.dressmeEngine.data.DressMeCloakData;
+
+public final class DressMeCloakHolder extends AbstractHolder
+{
+ private static final DressMeCloakHolder _instance = new DressMeCloakHolder();
+
+ public static DressMeCloakHolder getInstance()
+ {
+ return _instance;
+ }
+
+ private final List<DressMeCloakData> _cloak = new ArrayList<>();
+
+ public void addCloak(DressMeCloakData cloak)
+ {
+ _cloak.add(cloak);
+ }
+
+ public List<DressMeCloakData> getAllCloaks()
+ {
+ return _cloak;
+ }
+
+ public DressMeCloakData getCloak(int id)
+ {
+ for (DressMeCloakData cloak : _cloak)
+ {
+ if (cloak.getId() == id)
+ {
+ return cloak;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public int size()
+ {
+ return _cloak.size();
+ }
+
+ @Override
+ public void clear()
+ {
+ _cloak.clear();
+ }
+}

CitarDATA

### Eclipse Workspace Patch 1.0
#P L2J_SunriseProject_Data
Index: dist/game/data/html/sunrise/dressme/template-weapon.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/template-weapon.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/template-weapon.htm   (working copy)
@@ -0,0 +1,24 @@
+<tr>
+   <td width=270 height=46 align=center valign=top>
+      <table border=0 cellspacing=2 cellpadding=4 width=270 height=46>
+         <tr>
+            <td FIXWIDTH=40 align=right valign=top>
+               <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{icon}">
+                  <tr>
+                     <td width=32 align=center valign=top>
+                        <img src="l2ui_ch3.multisell_plusicon" width="32" height="32">
+                     </td>
+                  </tr>
+               </table>
+            </td>
+            <td FIXWIDTH=170 align=left valign=top>
+               <font color="99CC00">{name}</font>
+               <br1>› <font color=999966>Price:</font> {price}.
+            </td>
+            <td valign="top" align="center">
+               <button action="{bypass}" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Blue_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Blue" />
+            </td>
+         </tr>
+      </table>
+   </td>
+</tr>
\ No newline at end of file
Index: dist/game/data/html/sunrise/dressme/undressme.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/undressme.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/undressme.htm   (working copy)
@@ -0,0 +1,215 @@
+<html>
+<head>
+<body scroll="no">
+<title>UnDress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td width=270 height=40 align=center valign=top>
+                  <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                     <tr>
+                        <td FIXWIDTH=40 align=right valign=top>
+                           <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.etc_letter_in_bottle_red_i00">
+                              <tr>
+                                 <td width=32 align=center valign=top>
+                                    <img src="icon.panel_2" width="32" height="32">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                        <td FIXWIDTH=170 align=left valign=top>
+                           <font color="CC3333">Visual change equip</font>
+                           <br1>› Information.
+                        </td>
+                        <td valign="top" align="center">
+                           <button action="bypass -h voice .dressinfo" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Gray_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Gray" />
+                        </td>
+                     </tr>
+                  </table>
+                  <table width=270 height=100>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.weapon_ysandy_crusher_i01">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="CC3333">Weapon</font>
+                                    <br1>› <font color=CCCC33>Price:</font> Free.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .undressme-weapon" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.armor_t94_u_i03">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="CC3333">Armor</font>
+                                    <br1>› <font color=CCCC33>Price:</font> Free.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .undressme-armor" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.evilgate_shield_i01">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="CC3333">Shield</font>
+                                    <br1>› <font color=CCCC33>Price:</font> Free.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .undressme-shield" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.feud_lord_cloak_i00">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="CC3333">Cloak</font>
+                                    <br1>› <font color=CCCC33>Price:</font> Free.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .undressme-cloak" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.armor_t94_u_i03">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="CC3333">Hat</font>
+                                    <br1>› <font color=CCCC33>Price:</font> Free.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .undressme-hat" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="branchsys2.br_transform_lilith_01_i00">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="99CC33"><?show_hide?></font>
+                                    <br1>› <font color=CCCC33>Price:</font> Free.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .<?show_hide_b?>" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="branchsys2.br_s_search_treasure1_i00">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="669933">Add visual effect</font>
+                                    <br1>› <font color=CCCC33>Price:</font> Depends on the type.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .dressme" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/xsd/dressme/weapon.xsd
===================================================================
--- dist/game/data/xsd/dressme/weapon.xsd   (revision 0)
+++ dist/game/data/xsd/dressme/weapon.xsd   (working copy)
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+   <xs:element name="list">
+      <xs:complexType>
+         <xs:sequence>
+            <xs:element name="weapon" maxOccurs="unbounded">
+               <xs:complexType>
+                  <xs:sequence>
+                     <xs:element name="price">
+                        <xs:complexType>
+                           <xs:attribute name="id" type="xs:int"></xs:attribute>
+                           <xs:attribute name="count" type="xs:int"></xs:attribute>
+                        </xs:complexType>
+                     </xs:element>
+                  </xs:sequence>
+                  <xs:attribute name="id" type="xs:int"></xs:attribute>
+                  <xs:attribute name="name" type="xs:string"></xs:attribute>
+                  <xs:attribute name="type" type="xs:string"></xs:attribute>
+                  <xs:attribute name="isBig" type="xs:string"></xs:attribute>
+               </xs:complexType>
+            </xs:element>
+         </xs:sequence>
+      </xs:complexType>
+   </xs:element>
+</xs:schema>
\ No newline at end of file
Index: dist/game/data/html/sunrise/dressme/template-shield.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/template-shield.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/template-shield.htm   (working copy)
@@ -0,0 +1,24 @@
+<tr>
+   <td width=270 height=46 align=center valign=top>
+      <table border=0 cellspacing=2 cellpadding=4 width=270 height=46>
+         <tr>
+            <td FIXWIDTH=40 align=right valign=top>
+               <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{icon}">
+                  <tr>
+                     <td width=32 align=center valign=top>
+                        <img src="l2ui_ch3.multisell_plusicon" width="32" height="32">
+                     </td>
+                  </tr>
+               </table>
+            </td>
+            <td FIXWIDTH=170 align=left valign=top>
+               <font color="99CC00">{name}</font>
+               <br1>› <font color=999966>Price:</font> {price}.
+            </td>
+            <td valign="top" align="center">
+               <button action="{bypass}" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Blue_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Blue" />
+            </td>
+         </tr>
+      </table>
+   </td>
+</tr>
\ No newline at end of file
Index: dist/game/data/html/sunrise/dressme/dress-shield.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/dress-shield.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/dress-shield.htm   (working copy)
@@ -0,0 +1,72 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td valign="top" align="center"><br>
+                  <font name="__SystemEditBoxFont" color="669933">{name}</font>
+                  <img src="L2UI_CH3.herotower_deco" width="252" height="32">
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center" height=250>
+                  <table width=270 height=46>
+                     <tr>
+                        <td width=270 height=40 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                              <tr>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{my_shield_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=20 align=center valign=center>
+                                    <img src="L2UI_CH3.shortcut_minimizev_down" width="16" height="16">
+                                 </td>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{item_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=184 align=left valign=top>
+                                    <font color="99CC66">{item_name}</font>
+                                    <br1>› Grade: {item_grade}.
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                  </table>
+                  <table width=270 height=46>
+                     <tr>
+                        <td valign="top" align="center"><br><br>
+                           <font color="99CC00">Cost:</font> {price}.
+                           <button action="{bypass}" value="Change visual to {name}" width=282 height=26 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF">
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center">
+                  <button action="bypass -h voice .dressme" width=32 height=32 back="L2UI_CT1.MiniMap_DF_MinusBtn_Red_Down" fore="L2UI_CT1.MiniMap_DF_MinusBtn_Red" />
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/xsd/dressme/cloak.xsd
===================================================================
--- dist/game/data/xsd/dressme/cloak.xsd   (revision 0)
+++ dist/game/data/xsd/dressme/cloak.xsd   (working copy)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+   <xs:element name="list">
+      <xs:complexType>
+         <xs:sequence>
+            <xs:element name="cloak" maxOccurs="unbounded">
+               <xs:complexType>
+                  <xs:sequence>
+                     <xs:element name="price">
+                        <xs:complexType>
+                           <xs:attribute name="id" type="xs:int"></xs:attribute>
+                           <xs:attribute name="count" type="xs:int"></xs:attribute>
+                        </xs:complexType>
+                     </xs:element>
+                  </xs:sequence>
+                  <xs:attribute name="number" type="xs:int"></xs:attribute>
+                  <xs:attribute name="id" type="xs:int"></xs:attribute>
+                  <xs:attribute name="name" type="xs:string"></xs:attribute>
+               </xs:complexType>
+            </xs:element>
+         </xs:sequence>
+      </xs:complexType>
+   </xs:element>
+</xs:schema>
\ No newline at end of file
Index: dist/game/data/html/sunrise/dressme/dress-weapon.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/dress-weapon.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/dress-weapon.htm   (working copy)
@@ -0,0 +1,72 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td valign="top" align="center"><br>
+                  <font name="__SystemEditBoxFont" color="669933">{name}</font>
+                  <img src="L2UI_CH3.herotower_deco" width="252" height="32">
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center" height=250>
+                  <table width=270 height=46>
+                     <tr>
+                        <td width=270 height=40 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                              <tr>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{my_weapon_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=20 align=center valign=center>
+                                    <img src="L2UI_CH3.shortcut_minimizev_down" width="16" height="16">
+                                 </td>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{item_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=184 align=left valign=top>
+                                    <font color="99CC66">{item_name}</font>
+                                    <br1>› Grade: {item_grade}.
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                  </table>
+                  <table width=270 height=46>
+                     <tr>
+                        <td valign="top" align="center"><br><br>
+                           <font color="99CC00">Cost:</font> {price}.
+                           <button action="{bypass}" value="Change visual to {name}" width=282 height=26 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF">
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center">
+                  <button action="bypass -h voice .dressme" width=32 height=32 back="L2UI_CT1.MiniMap_DF_MinusBtn_Red_Down" fore="L2UI_CT1.MiniMap_DF_MinusBtn_Red" />
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/html/sunrise/dressme/dress-cloak.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/dress-cloak.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/dress-cloak.htm   (working copy)
@@ -0,0 +1,72 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td valign="top" align="center"><br>
+                  <font name="__SystemEditBoxFont" color="669933">{name}</font>
+                  <img src="L2UI_CH3.herotower_deco" width="252" height="32">
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center" height=250>
+                  <table width=270 height=46>
+                     <tr>
+                        <td width=270 height=40 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                              <tr>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{my_cloak_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=20 align=center valign=center>
+                                    <img src="L2UI_CH3.shortcut_minimizev_down" width="16" height="16">
+                                 </td>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{item_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=184 align=left valign=top>
+                                    <font color="99CC66">{item_name}</font>
+                                    <br1>› Grade: {item_grade}.
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                  </table>
+                  <table width=270 height=46>
+                     <tr>
+                        <td valign="top" align="center"><br><br>
+                           <font color="99CC00">Cost:</font> {price}.
+                           <button action="{bypass}" value="Change visual to {name}" width=282 height=26 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF">
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center">
+                  <button action="bypass -h voice .dressme" width=32 height=32 back="L2UI_CT1.MiniMap_DF_MinusBtn_Red_Down" fore="L2UI_CT1.MiniMap_DF_MinusBtn_Red" />
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/xml/sunrise/dressme/armor.xml
===================================================================
--- dist/game/data/xml/sunrise/dressme/armor.xml   (revision 0)
+++ dist/game/data/xml/sunrise/dressme/armor.xml   (working copy)
@@ -0,0 +1,283 @@
+<?xml version='1.0' encoding='utf-8'?>
+<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/dressme/armor.xsd">
+   <dress id="1" name="Zubei's Breastplate Set" type="HEAVY">
+      <set chest="357" legs="383" gloves="5710" feet="5726" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="2" name="Avadon Breastplate Set" type="HEAVY">
+      <set chest="2376" legs="2379" gloves="5714" feet="5730" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="3" name="Zubei's Leather Shirt Set" type="LIGHT">
+      <set chest="2384" legs="2388" gloves="5711" feet="5727" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="4" name="Avadon Leather Armor Set" type="LIGHT">
+      <set chest="2390" legs="-1" gloves="5715" feet="5731" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="5" name="Zubei Set" type="ROBE">
+      <set chest="2397" legs="2402" gloves="5712" feet="5728" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="6" name="Avadon Robe Set" type="ROBE">
+      <set chest="2406" legs="-1" gloves="5716" feet="5732" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="7" name="Blue Wolf Breastplate Set" type="HEAVY">
+      <set chest="358" legs="2380" gloves="5718" feet="5734" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="8" name="Doom Armor Set" type="HEAVY">
+      <set chest="2381" legs="-1" gloves="5722" feet="5738" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="9" name="Blue Wolf Leather Armor Set" type="LIGHT">
+      <set chest="2391" legs="-1" gloves="5719" feet="5735" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="10" name="LeatherDoom Set" type="LIGHT">
+      <set chest="2392" legs="-1" gloves="5723" feet="5739" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="11" name="Blue Wolf Tunic Set" type="ROBE">
+      <set chest="2398" legs="2403" gloves="5720" feet="5736" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="12" name="Doom Set" type="HEAVY">
+      <set chest="2399" legs="2404" gloves="5724" feet="5740" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="13" name="Dark Crystal Breastplate Set" type="HEAVY">
+      <set chest="365" legs="388" gloves="5765" feet="5777" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="14" name="Tallum Armor Set" type="HEAVY">
+      <set chest="2382" legs="-1" gloves="5768" feet="5780" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="15" name="Dark Crystal Leather Armor Set" type="LIGHT">
+      <set chest="2385" legs="2389" gloves="5766" feet="5778" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="16" name="Tallum Leather Armor Set" type="LIGHT">
+      <set chest="2393" legs="-1" gloves="5769" feet="5781" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="17" name="Tallum Tunic Set" type="ROBE">
+      <set chest="2400" legs="2405" gloves="5770" feet="5782" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="18" name="Dark Crystal Robe Set" type="ROBE">
+      <set chest="2407" legs="-1" gloves="5767" feet="5779" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="19" name="Nightmare Set" type="HEAVY">
+      <set chest="374" legs="-1" gloves="5771" feet="5783" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="20" name="Majestic Armor Set" type="HEAVY">
+      <set chest="2383" legs="-1" gloves="5774" feet="5786" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="21" name="Nightmarish Leather Armor Set" type="LIGHT">
+      <set chest="2394" legs="-1" gloves="5772" feet="5784" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="22" name="Majestic Leather Armor Set" type="LIGHT">
+      <set chest="2395" legs="-1" gloves="5775" feet="5787" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="23" name="Nightmare Robe Set" type="ROBE">
+      <set chest="2408" legs="-1" gloves="5773" feet="5785" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="24" name="Majestic Robe Set" type="ROBE">
+      <set chest="2409" legs="-1" gloves="5776" feet="5788" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="25" name="Imperial Crusader Breastplate Set" type="HEAVY">
+      <set chest="6373" legs="6374" gloves="6375" feet="6376" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="26" name="Draconic Leather Armor Set" type="LIGHT">
+      <set chest="6379" legs="-1" gloves="6380" feet="6381" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="27" name="Major Arcana Robe Set" type="ROBE">
+      <set chest="6383" legs="-1" gloves="6384" feet="6385" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="28" name="Clan Oath Armor Set" type="HEAVY">
+      <set chest="7851" legs="-1" gloves="7852" feet="7853" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="29" name="Clan Oath Brigandine Set" type="LIGHT">
+      <set chest="7854" legs="-1" gloves="7855" feet="7856" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="30" name="Clan Oath Aketon Set" type="ROBE">
+      <set chest="7857" legs="-1" gloves="7858" feet="7859" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="31" name="Apella Armor Set" type="HEAVY">
+      <set chest="7861" legs="-1" gloves="7862" feet="7863" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="32" name="Apella Brigandine Set" type="LIGHT">
+      <set chest="7864" legs="-1" gloves="7865" feet="7866" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="33" name="Apella Doublet Set" type="ROBE">
+      <set chest="7867" legs="-1" gloves="7868" feet="7869" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="34" name="Dynasty Breast Plate Set" type="HEAVY">
+      <set chest="9417" legs="9421" gloves="9423" feet="9424" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="35" name="Dynasty Breast Plate Set" type="HEAVY">
+      <set chest="9418" legs="9421" gloves="9423" feet="9424" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="36" name="Dynasty Breast Plate Set" type="HEAVY">
+      <set chest="9419" legs="9421" gloves="9423" feet="9424" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="37" name="Dynasty Breast Plate Set" type="HEAVY">
+      <set chest="9420" legs="9421" gloves="9423" feet="9424" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="38" name="Dynasty Leather Armor Set" type="LIGHT">
+      <set chest="9426" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="39" name="Dynasty Leather Armor Set" type="LIGHT">
+      <set chest="9427" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="40" name="Dynasty Tunic Set" type="ROBE">
+      <set chest="9433" legs="9437" gloves="9439" feet="9440" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="41" name="Dynasty Tunic Set" type="ROBE">
+      <set chest="9434" legs="9437" gloves="9439" feet="9440" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="42" name="Dynasty Tunic Set" type="ROBE">
+      <set chest="9435" legs="9437" gloves="9439" feet="9440" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="43" name="Dynasty Tunic Set" type="ROBE">
+      <set chest="9436" legs="9437" gloves="9439" feet="9440" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="44" name="Improved Apella Armor Set" type="HEAVY">
+      <set chest="9831" legs="-1" gloves="9832" feet="9833" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="45" name="Improved Apella Brigandine Set" type="LIGHT">
+      <set chest="9834" legs="-1" gloves="9835" feet="9836" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="46" name="Improved Apella Doublet Set" type="ROBE">
+      <set chest="9837" legs="-1" gloves="9838" feet="9839" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="47" name="Dynasty Breast Plate Set" type="HEAVY">
+      <set chest="9416" legs="9421" gloves="9423" feet="9424" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="48" name="Dynasty Leather Armor Set" type="LIGHT">
+      <set chest="9425" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="49" name="Dynasty Tunic Set" type="ROBE">
+      <set chest="9432" legs="9437" gloves="9439" feet="9440" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="50" name="Dynasty Leather Armor Set" type="LIGHT">
+      <set chest="10126" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="51" name="Dynasty Leather Armor Set" type="LIGHT">
+      <set chest="10127" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="52" name="Dynasty Leather Armor Set" type="LIGHT">
+      <set chest="10168" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="53" name="Dynasty Leather Armor Set" type="LIGHT">
+      <set chest="10214" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="54" name="Dynasty Platinum Plate Set" type="HEAVY">
+      <set chest="10228" legs="9421" gloves="9423" feet="9424" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="55" name="Dynasty Platinum Plate Set" type="HEAVY">
+      <set chest="10229" legs="9421" gloves="9423" feet="9424" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="56" name="Dynasty Platinum Plate Set" type="HEAVY">
+      <set chest="10230" legs="9421" gloves="9423" feet="9424" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="57" name="Dynasty Platinum Plate Set" type="HEAVY">
+      <set chest="10231" legs="9421" gloves="9423" feet="9424" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="58" name="Dynasty Jewel Leather Mail Set" type="LIGHT">
+      <set chest="10233" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="59" name="Dynasty Jewel Leather Mail Set" type="LIGHT">
+      <set chest="10234" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="60" name="Dynasty Jeweled Leather Armor Set" type="LIGHT">
+      <set chest="10487" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="61" name="Dynasty Jeweled Leather Armor Set" type="LIGHT">
+      <set chest="10488" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="62" name="Dynasty Jeweled Leather Armor Set" type="LIGHT">
+      <set chest="10489" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="63" name="Dynasty Jeweled Leather Armor Set" type="LIGHT">
+      <set chest="10490" legs="9428" gloves="9430" feet="9431" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="64" name="Dynasty Silver Satin Tunic Set" type="ROBE">
+      <set chest="10236" legs="9437" gloves="9439" feet="9440" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="65" name="Dynasty Silver Satin Tunic Set" type="ROBE">
+      <set chest="10237" legs="9437" gloves="9439" feet="9440" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="66" name="Dynasty Silver Satin Tunic Set" type="ROBE">
+      <set chest="10238" legs="9437" gloves="9439" feet="9440" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="67" name="Dynasty Silver Satin Tunic Set" type="ROBE">
+      <set chest="10239" legs="9437" gloves="9439" feet="9440" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="68" name="Apella Combat Armor Set" type="HEAVY">
+      <set chest="14583" legs="-1" gloves="14584" feet="14585" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="69" name="Apella Combat Clothes Set" type="LIGHT">
+      <set chest="14586" legs="-1" gloves="14587" feet="14588" />
+      <price id="57" count="2000000000" />
+   </dress>
+   <dress id="70" name="Apella Combat Overcoat Set" type="ROBE">
+      <set chest="14589" legs="-1" gloves="14590" feet="14591" />
+      <price id="57" count="2000000000" />
+   </dress>
+</list>
\ No newline at end of file
Index: dist/game/data/html/sunrise/dressme/index-cloak.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/index-cloak.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/index-cloak.htm   (working copy)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td width=270 height=40 align=center valign=top>
+                  <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                     <tr>
+                        <td FIXWIDTH=40 align=right valign=top>
+                           <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.etc_letter_in_bottle_red_i00">
+                              <tr>
+                                 <td width=32 align=center valign=top>
+                                    <img src="icon.panel_2" width="32" height="32">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                        <td FIXWIDTH=170 align=left valign=top>
+                           <font color="CC3333">Visual change equip</font>
+                           <br1>› Information.
+                        </td>
+                        <td valign="top" align="center">
+                           <button action="bypass -h voice .dressinfo" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Gray_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Gray" />
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center" height=222>
+                  <table width=270 height=46>
+                        {list}
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center">
+                  <table width=50 height=30>
+                     <tr>
+                        {navigation}
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/html/sunrise/dressme/template-hat.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/template-hat.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/template-hat.htm   (working copy)
@@ -0,0 +1,24 @@
+<tr>
+   <td width=270 height=46 align=center valign=top>
+      <table border=0 cellspacing=2 cellpadding=4 width=270 height=46>
+         <tr>
+            <td FIXWIDTH=40 align=right valign=top>
+               <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{icon}">
+                  <tr>
+                     <td width=32 align=center valign=top>
+                        <img src="l2ui_ch3.multisell_plusicon" width="32" height="32">
+                     </td>
+                  </tr>
+               </table>
+            </td>
+            <td FIXWIDTH=170 align=left valign=top>
+               <font color="99CC00">{name}</font>
+               <br1>› <font color=999966>Price:</font> {price}.
+            </td>
+            <td valign="top" align="center">
+               <button action="{bypass}" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Blue_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Blue" />
+            </td>
+         </tr>
+      </table>
+   </td>
+</tr>
\ No newline at end of file
Index: dist/game/data/html/sunrise/dressme/info.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/info.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/info.htm   (working copy)
@@ -0,0 +1,50 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td width=270 height=310 align=center valign=top>
+                  <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                     <tr>
+                        <td FIXWIDTH=40 align=right valign=top>
+                           <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.etc_letter_in_bottle_red_i00">
+                              <tr>
+                                 <td width=32 align=center valign=top>
+                                    <img src="icon.panel_2" width="32" height="32">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                        <td FIXWIDTH=220 align=left valign=top>
+                           <font color="CC3333">Visual change equip</font>
+                           <br1>› The .dressme command is a brand new <br1>
+                           system that gives you the chance to <br1>
+                           change your armors or weapon or cloak <br1>
+                           texture to look like a different grade <br1>
+                           (B-A-S-Dynasty-Icarus textures ONLY). <br>
+                           *WARNING:* Full body armors can use <br1>
+                           ONLY full body armor textures, and <br1>
+                           half & half tunic/gaiter armor sets can <br1>
+                           use textures from other armors with same <br1>
+                           type half & half tunic/gaiters! <br>
+                           After you purchase the dressme, these features are saved to your character and restored when you log back in-game.
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center">
+                  <button action="bypass -h voice .dressme" width=32 height=32 back="L2UI_CT1.MiniMap_DF_MinusBtn_Red_Down" fore="L2UI_CT1.MiniMap_DF_MinusBtn_Red" />
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/html/sunrise/dressme/template-armor.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/template-armor.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/template-armor.htm   (working copy)
@@ -0,0 +1,24 @@
+<tr>
+   <td width=270 height=46 align=center valign=top>
+      <table border=0 cellspacing=2 cellpadding=4 width=270 height=46>
+         <tr>
+            <td FIXWIDTH=40 align=right valign=top>
+               <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{icon}">
+                  <tr>
+                     <td width=32 align=center valign=top>
+                        <img src="l2ui_ch3.multisell_plusicon" width="32" height="32">
+                     </td>
+                  </tr>
+               </table>
+            </td>
+            <td FIXWIDTH=170 align=left valign=top>
+               <font color="99CC00">{name}</font>
+               <br1>› <font color=999966>Price:</font> {price}.
+            </td>
+            <td valign="top" align="center">
+               <button action="{bypass}" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Blue_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Blue" />
+            </td>
+         </tr>
+      </table>
+   </td>
+</tr>
\ No newline at end of file
Index: dist/game/data/xml/sunrise/dressme/weapon.xml
===================================================================
--- dist/game/data/xml/sunrise/dressme/weapon.xml   (revision 0)
+++ dist/game/data/xml/sunrise/dressme/weapon.xml   (working copy)
@@ -0,0 +1,1206 @@
+<?xml version='1.0' encoding='utf-8'?>
+<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/dressme/weapon.xsd">
+   <weapon id="78" name="Great Sword" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="79" name="Sword of Damascus" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="80" name="Tallum Blade" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="81" name="Dragon Slayer" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="82" name="God's Blade" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="85" name="Phantom Sword" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="91" name="Heavy War Axe" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="92" name="Sprite's Staff" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="97" name="Lance" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="98" name="Halberd" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="142" name="Keshanberk" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="146" name="Ghoulbane" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="147" name="Tear of Darkness" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="148" name="Sword of Valhalla" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="149" name="Sword of Life" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="150" name="Elemental Sword" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="151" name="Sword of Miracles" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="164" name="Elysian" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="165" name="Yablonski's Hammer" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="171" name="Deadman's Glory" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="175" name="Art of Battle Axe" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10004" name="Dynasty Dual Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10215" name="Icarus Sawsword" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10216" name="Icarus Disperser" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10217" name="Icarus Spirit" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10218" name="Icarus Heavy Arms" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10219" name="Icarus Trident" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10220" name="Icarus Hammer" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10221" name="Icarus Hand" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10222" name="Icarus Hall" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10223" name="Icarus Spitter" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10224" name="Icarus Stinger" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10225" name="Icarus Wingblade" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10226" name="Icarus Shooter" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10252" name="Dynasty Staff" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10253" name="Dynasty Crusher" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10415" name="Icarus Dual Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10870" name="Great Sword - Lightning" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10874" name="Great Axe - Thunder" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10878" name="Sword of Limit*Sword of Limit - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10879" name="Sword of Limit*Sword of Delusion - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10880" name="Sword of Limit*Sword of Nightmare - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10881" name="Sword of Limit*Tsurugi - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10882" name="Innominate Victory - Lightning" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10886" name="Dark Elven Long Bow - Concentration" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10890" name="Sword of Delusion*Sword of Delusion - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10891" name="Sword of Delusion*Sword of Nightmare - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10892" name="Sword of Delusion*Tsurugi - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10893" name="Sword of Valhalla - Nature" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10897" name="Stormbringer*Samurai Long Sword - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10898" name="Spell Breaker - Hail" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10902" name="Arthro Nail - Destruction" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10906" name="Ice Storm Hammer - Lightning" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10910" name="Sword of Nightmare*Sword of Nightmare - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10911" name="Sword of Nightmare*Tsurugi - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10912" name="Military Fleuret - Destruction" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10916" name="Sprite's Staff - Hail" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10920" name="Tsurugi*Tsurugi - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10921" name="Caliburs*Sword of Limit - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10922" name="Caliburs*Sword of Delusion - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10923" name="Caliburs*Sword of Nightmare - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10924" name="Caliburs*Tsurugi - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10925" name="Caliburs*Caliburs - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10926" name="Kris - Confusion" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10930" name="Keshanberk - Destruction" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10934" name="Peacemaker - Concentration" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10938" name="Heavy War Axe - Earth" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10942" name="Hell Knife - Confusion" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10946" name="Raid Sword*Samurai Long Sword - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10947" name="Shamshir*Samurai Long Sword - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10948" name="Spirit Sword*Samurai Long Sword - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10949" name="Katana*Samurai Long Sword - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10950" name="Sword of Limit*Samurai Long Sword - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10951" name="Sword of Delusion*Samurai Long Sword - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10952" name="Sword of Nightmare*Samurai Long Sword - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10953" name="Tsurugi*Samurai Long Sword - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10954" name="Caliburs*Samurai Long Sword - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10955" name="Guardian Sword - Great Gale" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10959" name="Sword of Damascus - Earth" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10963" name="Dismantler - Great Gale" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10967" name="Lance - Earth" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10971" name="Bellion Cestus - Great Gale" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10975" name="Staff of Evil Spirits - Holy Spirit" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10979" name="Deadman's Glory - Landslide" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10983" name="Star Buster - Great Gale" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10987" name="Samurai Long Sword*Samurai Long Sword - Landslide" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10988" name="Art of Battle Axe - Landslide" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10992" name="Demon Dagger - Great Gale" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="10997" name="Kaim Vanul's Bones - Earth" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11001" name="Colichemarde - Earth" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11005" name="Wizard's Tear - Cleverness" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11009" name="Bow of Peril - Earth" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11013" name="Hell Hound - Earth" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11017" name="Dasparion's Staff - Hail" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11021" name="Doomchanter - Concentration" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11025" name="White Lightning - Destruction" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11029" name="Meteor Shower - Earth" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11033" name="Blood Tornado - Destruction" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11037" name="Bloody Orchid - Confusion" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11041" name="Elemental Sword - Hail" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11045" name="Spiritual Eye - Hail" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11049" name="Infernal Master - Concentration" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11053" name="Carnage Bow - Concentration" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11057" name="Keshanberk*Keshanberk - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11058" name="Tallum Blade - Destruction" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11062" name="Destroyer Hammer - Lightning" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11066" name="Divine Pain - Concentration" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11070" name="Halberd - Lightning" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11074" name="Keshanberk*Damascus - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11075" name="Lacerator - Thunder" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11079" name="Damascus*Damascus - Thunder" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11080" name="Dark Legion - Thunder" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11084" name="Undertaker - Evil Spirit" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11088" name="Doom Crusher - Thunder" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11092" name="Dragon Grinder - Earth" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11096" name="Dragon Slayer - Evil Spirit" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11100" name="Flaming Dragon Skull - Wisdom" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11104" name="Branch of the Mother Tree - Nature" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11108" name="Sword of Miracles - Holy Spirit" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11112" name="Reaper - Clairvoyance" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11116" name="Soul Separator - On Fire" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11120" name="Elysian - Great Gale" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11124" name="Soul Bow - Clairvoyance" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11128" name="Tallum Glaive - On Fire" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11133" name="Naga Storm - Molar" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11137" name="Daimon Crystal - Wisdom" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11141" name="Barakiel's Axe - On Fire" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11145" name="Screaming Vengeance - Concentration" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11149" name="Behemoth's Tuning Fork - Destruction" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11153" name="Bultgang - Earth" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11157" name="Shyeed's Bow - Concentration" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11161" name="Sword of Ipos - Earth" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11165" name="Sobekk's Hurricane - Landslide" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11169" name="Sirra's Blade - Landslide" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11173" name="Eclair Bijou - Landslide" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11177" name="Tiphon's Spear - Landslide" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11181" name="Tallum Blade*Damascus - Landslide" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11182" name="Themis' Tongue - Cleverness" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11186" name="Cabrio's Hand - Cleverness" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11190" name="Gram - Thunder" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11194" name="Demon Splinter - Thunder" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11198" name="Draconic Bow - Earth" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11202" name="Dragon Hunter Axe - Thunder" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11206" name="Laevateinn - Lightning" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11210" name="Basalt Battlehammer - Concentration" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11214" name="Sarunga - Earth" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11218" name="Saint Spear - Destruction" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11222" name="Arcana Mace - Nature" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11226" name="Angel Slayer - Concentration" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11230" name="Imperial Staff - Nature" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11234" name="Tallum Blade*Dark Legion's Edge - Lightning" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11235" name="Forgotten Blade - Lightning" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11239" name="Heaven's Divider - Thunder" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11243" name="Dynasty Ancient Sword - Great Gale" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11247" name="Dynasty Knife - Great Gale" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11251" name="Dynasty Dual Sword - Earth" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11252" name="Dynasty Rapier - Earth" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11256" name="Dynasty Mace - Earth" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11260" name="Dynasty Bagh-Nakh - Great Gale" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11264" name="Dynasty Bow - Great Gale" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11268" name="Dynasty Blade - Great Gale" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11272" name="Dynasty Sword - Earth" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11276" name="Dynasty Staff - Holy Spirit" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11280" name="Dynasty Cudgel - Landslide" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11284" name="Dynasty Crusher - Great Gale" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11288" name="Dynasty Crossbow - Great Gale" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11292" name="Dynasty Phantom - Nature" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11296" name="Dynasty Halberd - Earth" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11300" name="Icarus Dual Sword - Destruction" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11301" name="Icarus Disperser - Confusion" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11305" name="Icarus Sawsword - Destruction" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11309" name="Icarus Shooter - Concentration" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11313" name="Icarus Stinger - Destruction" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11317" name="Icarus Spirit - Nature" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11321" name="Icarus Spitter - Concentration" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11325" name="Icarus Wingblade - Lightning" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11329" name="Icarus Trident - Thunder" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11333" name="Icarus Hammer - Earth" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11337" name="Icarus Hand - Destruction" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11341" name="Icarus Heavy Arms - Lightning" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="11345" name="Icarus Hall - Hail" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13042" name="Ancient Legacy Sword" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13043" name="Enhanced Ancient Legacy Sword" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13044" name="Complete Ancient Legacy Sword" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13052" name="Spear of Silenos" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13053" name="Enhanced Spear of Silenos" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13054" name="Complete Spear of Silenos" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13845" name="Attribute Master Yin's Sword" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13881" name="Attribute Master Yang's Sword" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13882" name="Dynasty Dual Daggers" type="DUALDAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13883" name="Icarus Dual Daggers" type="DUALDAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13985" name="Exclusive to Monsters (Death Slayer_r)" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13986" name="Exclusive to Monsters (Death Slayer_l)" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="13987" name="Exclusive to Monsters (Savage Warrior)" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14526" name="Dynasty Dual Daggers - Great Gale" type="DUALDAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14527" name="Icarus Dual Daggers - Confusion" type="DUALDAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14560" name="Dagger of Val Turner Family" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14561" name="Slasher of Val Turner Family" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14562" name="Sword of Ashton Family" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14563" name="Claw of Ashton Family" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14564" name="Slasher of Esthus Family" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14565" name="Great Hammer of Esthus Family" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14566" name="Staff of Dake Family" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14567" name="Hall of Dake Family" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14568" name="Bow of Cadmus Family" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14569" name="Mace of Cadmus Family" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14570" name="Dual Sword of Hunter Family" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14571" name="Spear of Hunter Family" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14572" name="Staff of Abygail Family" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14573" name="Great Hammer of Abygail Family" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14574" name="Spear of Halter Family" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14575" name="Dagger of Halter Family" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14576" name="Mace of Orwen Family" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14577" name="Claw of Orwen Family" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14578" name="Slicer of Val Turner Family" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14579" name="?p?e of Ashton Family" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14580" name="Slicer of Esthus Family" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="14581" name="Estoc of Cadmus Family" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="15280" name="NPC use clear 1HS" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="15281" name="NPC use clear 2HS" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="15300" name="NPC exclusive transparent dual" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="15301" name="NPC exclusive transparent pole" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="15302" name="NPC exclusive transparent bow" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="15303" name="NPC exclusive transparent claw" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="15304" name="NPC exclusive transparent bowgun" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="15305" name="NPC exclusive transparent rapier" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="15306" name="NPC exclusive transparent dual dagger" type="DUALDAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="15310" name="Sacred Sword of Einhasad" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="15687" name="Triumph Rapier" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="207" name="Staff of Phantom" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="208" name="Staff of Seal" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="209" name="Divine Staff" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="210" name="Staff of Evil Spirits" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="211" name="Staff of Nobility" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="212" name="Dasparion's Staff" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="213" name="Branch of the Mother Tree" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="214" name="The Staff" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="229" name="Kris" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="234" name="Demon Dagger" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="235" name="Bloody Orchid" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="236" name="Soul Separator" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="237" name="Dragon's Tooth" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="243" name="Hell Knife" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="264" name="Pata" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="267" name="Arthro Nail" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="268" name="Bellion Cestus" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="269" name="Blood Tornado" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="270" name="Dragon Grinder" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="284" name="Dark Elven Long Bow" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="287" name="Bow of Peril" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="288" name="Carnage Bow" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="289" name="Soul Bow" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="290" name="The Bow" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="21935" name="Butcher Blades" type="DUALDAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="21937" name="Butcher Blades - Confusion" type="DUALDAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="21955" name="Blades of Delusion" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="21957" name="Blades of Delusion - Earth" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="21959" name="Blood Brother" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="21966" name="Blood Brother - Great Gale" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="21973" name="Mardil's Fan" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="21977" name="Mardil's Fan - Holy Spirit" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2500" name="Dark Legion's Edge" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2504" name="Meteor Shower" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2566" name="Stormbringer*Caliburs" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2567" name="Stormbringer*Sword of Limit" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2568" name="Stormbringer*Sword of Delusion" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2569" name="Stormbringer*Sword of Nightmare" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2570" name="Stormbringer*Tsurugi" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2571" name="Stormbringer*Samurai Long sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2576" name="Shamshir*Caliburs" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2577" name="Shamshir*Sword of Limit" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2578" name="Shamshir*Sword of Delusion" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2579" name="Shamshir*Sword of Nightmare" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2580" name="Shamshir*Tsurugi" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2581" name="Shamshir*Samurai Long Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2585" name="Katana*Caliburs" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2586" name="Katana*Sword of Limit" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2587" name="Katana*Sword of Delusion" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2588" name="Katana*Sword of Nightmare" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2589" name="Katana*Tsurugi" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2590" name="Katana*Samurai Long Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2593" name="Spirit Sword*Caliburs" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2594" name="Spirit Sword*Sword of Limit" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2595" name="Spirit Sword*Sword of Delusion" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2596" name="Spirit Sword*Sword of Nightmare" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2597" name="Spirit Sword*Tsurugi" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2598" name="Spirit Sword*Samurai Long Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2600" name="Raid Sword*Caliburs" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2601" name="Raid Sword*Sword of Limit" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2602" name="Raid Sword*Sword of Delusion" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2603" name="Raid Sword*Sword of Nightmare" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2604" name="Raid Sword*Tsurugi" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2605" name="Raid Sword*Samurai Long Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2606" name="Caliburs*Caliburs" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2607" name="Caliburs*Sword of Limit" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2608" name="Caliburs*Sword of Delusion" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2609" name="Caliburs*Sword of Nightmare" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2610" name="Caliburs*Tsurugi" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2611" name="Caliburs*Samurai Long Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2612" name="Sword of Limit*Sword of Limit" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2613" name="Sword of Limit*Sword of Delusion" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2614" name="Sword of Limit*Sword of Nightmare" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2615" name="Sword of Limit*Tsurugi" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2616" name="Sword of Limit*Samurai Long Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2617" name="Sword of Delusion*Sword of Delusion" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2618" name="Sword of Delusion*Sword of Nightmare" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2619" name="Sword of Delusion*Tsurugi" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2620" name="Sword of Delusion*Samurai Long Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2621" name="Sword of Nightmare*Sword of Nightmare" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2622" name="Sword of Nightmare*Tsurugi" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2623" name="Sword of Nightmare*Samurai Long Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2624" name="Tsurugi*Tsurugi" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2625" name="Tsurugi*Samurai Long Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="2626" name="Samurai Long Sword*Samurai Long Sword" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="300" name="Great Axe" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="304" name="Orcish Halberd" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="305" name="Tallum Glaive" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="306" name="Dragon Claw Axe" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="307" name="Aurakyria Lance" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="4903" name="Dasparion's Staff" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="4904" name="Dasparion's Staff" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="4905" name="Dasparion's Staff" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="5233" name="Keshanberk*Keshanberk" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="5629" name="Orcish Halberd" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="5630" name="Orcish Halberd" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="5631" name="Orcish Halberd" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="5704" name="Keshanberk*Keshanberk" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="5705" name="Keshanberk*Damascus" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="5706" name="Damascus*Damascus" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6364" name="Forgotten Blade" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6365" name="Basalt Battlehammer" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6366" name="Imperial Staff" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6367" name="Angel Slayer" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6368" name="Shining Bow" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6369" name="Dragon Hunter Axe" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6370" name="Saint Spear" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6371" name="Demon Splinter" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6372" name="Heaven's Divider" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6532" name="KingFisher Rod" type="FISHINGROD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6533" name="Cygnus Pole" type="FISHINGROD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6534" name="Triton Pole" type="FISHINGROD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6579" name="Arcana Mace" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6580" name="Tallum Blade*Dark Legion's Edge" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="6722" name="Monster Only(Ahrimanes)" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7575" name="Draconic Bow" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7834" name="Art of Battle Axe" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7883" name="Guardian Sword" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7884" name="Infernal Master" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7889" name="Wizard's Tear" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7892" name="Spell Breaker" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7893" name="Kaim Vanul's Bones" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7894" name="Spiritual Eye" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7895" name="Flaming Dragon Skull" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7899" name="Destroyer Hammer" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7900" name="Ice Storm Hammer" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7901" name="Star Buster" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="7902" name="Doom Crusher" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8678" name="Sirra's Blade" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8679" name="Sword of Ipos" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8680" name="Barakiel's Axe" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8681" name="Behemoth's Tuning Fork" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8682" name="Naga Storm" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8683" name="Tiphon's Spear" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8684" name="Shyeed's Bow" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8685" name="Sobekk's Hurricane" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8686" name="Themis' Tongue" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8687" name="Cabrio's Hand" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8688" name="Daimon Crystal" type="BLUNT" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8763" name="Elrokian Trap" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="8938" name="Damascus * Tallum Blade" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9304" name="Military Fleuret" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9308" name="Innominate Victory" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9312" name="Peacemaker" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9316" name="Colichemarde" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9320" name="Dismantler" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9324" name="Hell Hound" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9328" name="White Lightning" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9332" name="Divine Pain" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9336" name="Doomchanter" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9340" name="Lacerator" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9344" name="Undertaker" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9348" name="Reaper" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9352" name="?clair Bijou" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9356" name="Durendal" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9360" name="Screaming Vengeance" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9364" name="Laevateinn" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9368" name="Gram" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9372" name="Sarnga" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9376" name="Dynasty Rapier" type="RAPIER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9380" name="Dynasty Ancient Sword" type="ANCIENTSWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9384" name="Dynasty Crossbow" type="CROSSBOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9442" name="Dynasty Sword" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9443" name="Dynasty Blade" type="SWORD" isBig="true">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9444" name="Dynasty Phantom" type="SWORD">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9445" name="Dynasty Bow" type="BOW">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9446" name="Dynasty Knife" type="DAGGER">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9447" name="Dynasty Halberd" type="POLE">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9448" name="Dynasty Cudgel" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9449" name="Dynasty Mace" type="BLUNT">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9450" name="Dynasty Bagh-Nakh" type="DUALFIST">
+      <price id="57" count="1000000000" />
+   </weapon>
+   <weapon id="9813" name="Orc Officer" type="DUAL">
+      <price id="57" count="1000000000" />
+   </weapon>
+</list>
\ No newline at end of file
Index: dist/game/data/xml/sunrise/dressme/cloak.xml
===================================================================
--- dist/game/data/xml/sunrise/dressme/cloak.xml   (revision 0)
+++ dist/game/data/xml/sunrise/dressme/cloak.xml   (working copy)
@@ -0,0 +1,24 @@
+<?xml version='1.0' encoding='utf-8'?>
+<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/dressme/cloak.xsd">
+   <cloak number="1" id="13687" name="Knight's Cloak">
+      <price id="57" count="500000000" />
+   </cloak>
+   <cloak number="2" id="21583" name="Festival's Cloak - True Black">
+      <price id="57" count="500000000" />
+   </cloak>
+   <cloak number="3" id="21587" name="Festival's Cloak - Bloody Red">
+      <price id="57" count="500000000" />
+   </cloak>
+   <cloak number="4" id="21588" name="Festival's Cloak - Pearl White">
+      <price id="57" count="500000000" />
+   </cloak>
+   <cloak number="5" id="21716" name="Cloak of Zaken">
+      <price id="57" count="500000000" />
+   </cloak>
+   <cloak number="6" id="21717" name="Cloak of Freya">
+      <price id="57" count="500000000" />
+   </cloak>
+   <cloak number="7" id="21718" name="Cloak of Frintezza">
+      <price id="57" count="500000000" />
+   </cloak>
+</list>
\ No newline at end of file
Index: dist/game/data/html/sunrise/dressme/dress-armor.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/dress-armor.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/dress-armor.htm   (working copy)
@@ -0,0 +1,177 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td valign="top" align="center"><br>
+                  <font name="__SystemEditBoxFont" color="669933">{name}</font>
+                  <img src="L2UI_CH3.herotower_deco" width="252" height="32">
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center" height=250>
+                  <table width=270 height=46>
+                     <tr>
+                        <td width=270 height=40 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                              <tr>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{my_chest_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=20 align=center valign=center>
+                                    <img src="L2UI_CH3.shortcut_minimizev_down" width="16" height="16">
+                                 </td>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{chest_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=184 align=left valign=top>
+                                    <font color="99CC66">{chest_name}</font>
+                                    <br1>› Grade: {chest_grade}.
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                  </table>
+                  <table width=270 height=46>
+                     <tr>
+                        <td width=270 height=40 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                              <tr>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{my_legs_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=20 align=center valign=center>
+                                    <img src="L2UI_CH3.shortcut_minimizev_down" width="16" height="16">
+                                 </td>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{legs_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=184 align=left valign=top>
+                                    <font color="99CC66">{legs_name}</font>
+                                    <br1>› Grade: {legs_grade}.
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                  </table>
+                  <table width=270 height=46>
+                     <tr>
+                        <td width=270 height=40 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                              <tr>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{my_gloves_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=20 align=center valign=center>
+                                    <img src="L2UI_CH3.shortcut_minimizev_down" width="16" height="16">
+                                 </td>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{gloves_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=184 align=left valign=top>
+                                    <font color="99CC66">{gloves_name}</font>
+                                    <br1>› Grade: {gloves_grade}.
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                  </table>
+                  <table width=270 height=46>
+                     <tr>
+                        <td width=270 height=40 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                              <tr>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{my_feet_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=20 align=center valign=center>
+                                    <img src="L2UI_CH3.shortcut_minimizev_down" width="16" height="16">
+                                 </td>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{feet_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=184 align=left valign=top>
+                                    <font color="99CC66">{feet_name}</font>
+                                    <br1>› Grade: {feet_grade}.
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                  </table>
+                  <table width=270 height=46>
+                     <tr>
+                        <td valign="top" align="center"><br><br>
+                           <font color="99CC00">Cost:</font> {price}.
+                           <button action="{bypass}" value="Change visual to {name}" width=282 height=26 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF">
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center">
+                  <button action="bypass -h voice .dressme" width=32 height=32 back="L2UI_CT1.MiniMap_DF_MinusBtn_Red_Down" fore="L2UI_CT1.MiniMap_DF_MinusBtn_Red" />
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/xml/sunrise/dressme/hat.xml
===================================================================
--- dist/game/data/xml/sunrise/dressme/hat.xml   (revision 0)
+++ dist/game/data/xml/sunrise/dressme/hat.xml   (working copy)
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='utf-8'?>
+<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/dressme/hat.xsd">
+   <hat number="1" id="6843" name="Cat Ears" slot="2"> <!-- Hair 2 -->
+      <price id="57" count="500000000" />
+   </hat>
+   <hat number="2" id="6844" name="Lady's Hair Pin" slot="2"> <!-- Hair 2 -->
+      <price id="57" count="500000000" />
+   </hat>
+   <hat number="3" id="7680" name="Raccoon Ears" slot="2"> <!-- Hair 2 -->
+      <price id="57" count="500000000" />
+   </hat>
+   <hat number="4" id="8660" name="Demon Horns" slot="2"> <!-- Hair 2 -->
+      <price id="57" count="500000000" />
+   </hat>
+   <hat number="5" id="8661" name="Mask of Spirits" slot="1"> <!-- Hair 1 -->
+      <price id="57" count="500000000" />
+   </hat>
+   <hat number="7" id="8565" name="Romantic Chapeau" slot="3"> <!-- Full Hair -->
+      <price id="57" count="500000000" />
+   </hat>
+   <hat number="8" id="8566" name="Iron Circlet" slot="3"> <!-- Full Hair -->
+      <price id="57" count="500000000" />
+   </hat>
+   <hat number="6" id="8918" name="Leather Cap" slot="3"> <!-- Full Hair -->
+      <price id="57" count="500000000" />
+   </hat>
+   <hat number="9" id="8919" name="First Mate's Hat" slot="3"> <!-- Full Hair -->
+      <price id="57" count="500000000" />
+   </hat>
+</list>
\ No newline at end of file
Index: dist/game/data/xsd/dressme/shield.xsd
===================================================================
--- dist/game/data/xsd/dressme/shield.xsd   (revision 0)
+++ dist/game/data/xsd/dressme/shield.xsd   (working copy)
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+   <xs:element name="list">
+      <xs:complexType>
+         <xs:sequence>
+            <xs:element name="shield" maxOccurs="unbounded">
+               <xs:complexType>
+                  <xs:sequence>
+                     <xs:element name="price">
+                        <xs:complexType>
+                           <xs:attribute name="id" type="xs:int"></xs:attribute>
+                           <xs:attribute name="count" type="xs:int"></xs:attribute>
+                        </xs:complexType>
+                     </xs:element>
+                  </xs:sequence>
+                  <xs:attribute name="number" type="xs:int"></xs:attribute>
+                  <xs:attribute name="id" type="xs:int"></xs:attribute>
+                  <xs:attribute name="name" type="xs:string"></xs:attribute>
+               </xs:complexType>
+            </xs:element>
+         </xs:sequence>
+      </xs:complexType>
+   </xs:element>
+</xs:schema>
\ No newline at end of file
Index: dist/game/data/html/sunrise/dressme/index-armor.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/index-armor.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/index-armor.htm   (working copy)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td width=270 height=40 align=center valign=top>
+                  <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                     <tr>
+                        <td FIXWIDTH=40 align=right valign=top>
+                           <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.etc_letter_in_bottle_red_i00">
+                              <tr>
+                                 <td width=32 align=center valign=top>
+                                    <img src="icon.panel_2" width="32" height="32">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                        <td FIXWIDTH=170 align=left valign=top>
+                           <font color="CC3333">Visual change equip</font>
+                           <br1>› Information.
+                        </td>
+                        <td valign="top" align="center">
+                           <button action="bypass -h voice .dressinfo" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Gray_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Gray" />
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center" height=222>
+                  <table width=270 height=46>
+                        {list}
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center">
+                  <table width=50 height=30>
+                     <tr>
+                        {navigation}
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/html/sunrise/dressme/template-cloak.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/template-cloak.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/template-cloak.htm   (working copy)
@@ -0,0 +1,24 @@
+<tr>
+   <td width=270 height=46 align=center valign=top>
+      <table border=0 cellspacing=2 cellpadding=4 width=270 height=46>
+         <tr>
+            <td FIXWIDTH=40 align=right valign=top>
+               <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{icon}">
+                  <tr>
+                     <td width=32 align=center valign=top>
+                        <img src="l2ui_ch3.multisell_plusicon" width="32" height="32">
+                     </td>
+                  </tr>
+               </table>
+            </td>
+            <td FIXWIDTH=170 align=left valign=top>
+               <font color="99CC00">{name}</font>
+               <br1>› <font color=999966>Price:</font> {price}.
+            </td>
+            <td valign="top" align="center">
+               <button action="{bypass}" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Blue_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Blue" />
+            </td>
+         </tr>
+      </table>
+   </td>
+</tr>
\ No newline at end of file
Index: dist/game/data/html/sunrise/dressme/index.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/index.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/index.htm   (working copy)
@@ -0,0 +1,215 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td width=270 height=40 align=center valign=top>
+                  <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                     <tr>
+                        <td FIXWIDTH=40 align=right valign=top>
+                           <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.etc_letter_in_bottle_red_i00">
+                              <tr>
+                                 <td width=32 align=center valign=top>
+                                    <img src="icon.panel_2" width="32" height="32">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                        <td FIXWIDTH=170 align=left valign=top>
+                           <font color="CC3333">Visual change equip</font>
+                           <br1>› Information.
+                        </td>
+                        <td valign="top" align="center">
+                           <button action="bypass -h voice .dressinfo" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Gray_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Gray" />
+                        </td>
+                     </tr>
+                  </table>
+                  <table width=270 height=100>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.weapon_ysandy_crusher_i01">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="669933">Weapon</font>
+                                    <br1>› <font color=CCCC33>Price:</font> 1 000 000 000 Adena.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .dressme-weapon" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.armor_t94_u_i03">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="669933">Armor</font>
+                                    <br1>› <font color=CCCC33>Price:</font> 2 000 000 000 Adena.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .dressme-armor" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.evilgate_shield_i01">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="669933">Shield</font>
+                                    <br1>› <font color=CCCC33>Price:</font> 5 000 000 Adena.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .dressme-shield" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.feud_lord_cloak_i00">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="669933">Cloak</font>
+                                    <br1>› <font color=CCCC33>Price:</font> 500 000 000 Adena.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .dressme-cloak" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.evilgate_shield_i01">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="669933">Hat</font>
+                                    <br1>› <font color=CCCC33>Price:</font> 500 000 000 Adena.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .dressme-hat" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="branchsys2.br_transform_lilith_01_i00">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="99CC33"><?show_hide?></font>
+                                    <br1>› <font color=CCCC33>Price:</font> Free.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .<?show_hide_b?>" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                     <tr>
+                        <td width=270 height=50 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=50>
+                              <tr>
+                                 <td FIXWIDTH=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="branchsys2.br_s_hammerpunch_treasure1_i001">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td FIXWIDTH=210 align=left valign=top>
+                                    <font color="CC3333">Remove visual effect</font>
+                                    <br1>› <font color=CCCC33>Price:</font> Free.
+                                 </td>
+                                 <td valign="top" align="center">
+                                    <br>
+                                    <button action="bypass -h voice .undressme" width="15" height="15" back="L2UI_CT1.Button_DF_Input_Down" fore="L2UI_CT1.Button_DF_Input">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/xsd/dressme/hat.xsd
===================================================================
--- dist/game/data/xsd/dressme/hat.xsd   (revision 0)
+++ dist/game/data/xsd/dressme/hat.xsd   (working copy)
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+   <xs:element name="list">
+      <xs:complexType>
+         <xs:sequence>
+            <xs:element name="hat" maxOccurs="unbounded">
+               <xs:complexType>
+                  <xs:sequence>
+                     <xs:element name="price">
+                        <xs:complexType>
+                           <xs:attribute name="id" type="xs:int"></xs:attribute>
+                           <xs:attribute name="count" type="xs:int"></xs:attribute>
+                        </xs:complexType>
+                     </xs:element>
+                  </xs:sequence>
+                  <xs:attribute name="number" type="xs:int"></xs:attribute>
+                  <xs:attribute name="id" type="xs:int"></xs:attribute>
+                  <xs:attribute name="name" type="xs:string"></xs:attribute>
+                  <xs:attribute name="slot" type="xs:int"></xs:attribute>
+               </xs:complexType>
+            </xs:element>
+         </xs:sequence>
+      </xs:complexType>
+   </xs:element>
+</xs:schema>
\ No newline at end of file
Index: dist/game/data/html/sunrise/dressme/index-shield.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/index-shield.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/index-shield.htm   (working copy)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td width=270 height=40 align=center valign=top>
+                  <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                     <tr>
+                        <td FIXWIDTH=40 align=right valign=top>
+                           <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.etc_letter_in_bottle_red_i00">
+                              <tr>
+                                 <td width=32 align=center valign=top>
+                                    <img src="icon.panel_2" width="32" height="32">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                        <td FIXWIDTH=170 align=left valign=top>
+                           <font color="CC3333">Visual change equip</font>
+                           <br1>› Information.
+                        </td>
+                        <td valign="top" align="center">
+                           <button action="bypass -h voice .dressinfo" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Gray_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Gray" />
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center" height=222>
+                  <table width=270 height=46>
+                        {list}
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center">
+                  <table width=50 height=30>
+                     <tr>
+                        {navigation}
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/html/sunrise/dressme/dress-hat.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/dress-hat.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/dress-hat.htm   (working copy)
@@ -0,0 +1,72 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td valign="top" align="center"><br>
+                  <font name="__SystemEditBoxFont" color="669933">{name}</font>
+                  <img src="L2UI_CH3.herotower_deco" width="252" height="32">
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center" height=250>
+                  <table width=270 height=46>
+                     <tr>
+                        <td width=270 height=40 align=center valign=top>
+                           <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                              <tr>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{my_hat_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=20 align=center valign=center>
+                                    <img src="L2UI_CH3.shortcut_minimizev_down" width="16" height="16">
+                                 </td>
+                                 <td width=40 align=right valign=top>
+                                    <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="{item_icon}">
+                                       <tr>
+                                          <td width=32 align=center valign=top>
+                                             <img src="icon.panel_2" width="32" height="32">
+                                          </td>
+                                       </tr>
+                                    </table>
+                                 </td>
+                                 <td width=184 align=left valign=top>
+                                    <font color="99CC66">{item_name}</font>
+                                    <br1>› Grade: {item_grade}.
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                     </tr>
+                  </table>
+                  <table width=270 height=46>
+                     <tr>
+                        <td valign="top" align="center"><br><br>
+                           <font color="99CC00">Cost:</font> {price}.
+                           <button action="{bypass}" value="Change visual to {name}" width=282 height=26 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF">
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center">
+                  <button action="bypass -h voice .dressme" width=32 height=32 back="L2UI_CT1.MiniMap_DF_MinusBtn_Red_Down" fore="L2UI_CT1.MiniMap_DF_MinusBtn_Red" />
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/html/sunrise/dressme/index-weapon.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/index-weapon.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/index-weapon.htm   (working copy)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td width=270 height=40 align=center valign=top>
+                  <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                     <tr>
+                        <td FIXWIDTH=40 align=right valign=top>
+                           <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.etc_letter_in_bottle_red_i00">
+                              <tr>
+                                 <td width=32 align=center valign=top>
+                                    <img src="icon.panel_2" width="32" height="32">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                        <td FIXWIDTH=170 align=left valign=top>
+                           <font color="CC3333">Visual change equip</font>
+                           <br1>› Information.
+                        </td>
+                        <td valign="top" align="center">
+                           <button action="bypass -h voice .dressinfo" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Gray_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Gray" />
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center" height=222>
+                  <table width=270 height=46>
+                        {list}
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center">
+                  <table width=50 height=30>
+                     <tr>
+                        {navigation}
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>
Index: dist/game/data/xml/sunrise/dressme/shield.xml
===================================================================
--- dist/game/data/xml/sunrise/dressme/shield.xml   (revision 0)
+++ dist/game/data/xml/sunrise/dressme/shield.xml   (working copy)
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='utf-8'?>
+<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/dressme/shield.xsd">
+   <shield number="1" id="2497" name="Full Plate Shield">
+      <price id="57" count="5000000" />
+   </shield>
+   <shield number="2" id="673" name="Avadon Shield">
+      <price id="57" count="5000000" />
+   </shield>
+   <shield number="3" id="633" name="Zubei's Shield">
+      <price id="57" count="5000000" />
+   </shield>
+   <shield number="4" id="110" name="Doom Shield">
+      <price id="57" count="5000000" />
+   </shield>
+   <shield number="5" id="641" name="Dark Crystal Shield">
+      <price id="57" count="5000000" />
+   </shield>
+   <shield number="6" id="2498" name="Shield of Nightmare">
+      <price id="57" count="5000000" />
+   </shield>
+   <shield number="7" id="6377" name="Imperial Crusader Shield">
+      <price id="57" count="5000000" />
+   </shield>
+   <shield number="8" id="9441" name="Dynasty Shield">
+      <price id="57" count="5000000" />
+   </shield>
+   <shield number="9" id="12811" name="Arcana Sigil">
+      <price id="57" count="5000000" />
+   </shield>
+   <shield number="10" id="12812" name="Dynasty Sigil">
+      <price id="57" count="5000000" />
+   </shield>
+</list>
\ No newline at end of file
Index: dist/game/data/xsd/dressme/armor.xsd
===================================================================
--- dist/game/data/xsd/dressme/armor.xsd   (revision 0)
+++ dist/game/data/xsd/dressme/armor.xsd   (working copy)
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+   <xs:element name="list">
+      <xs:complexType>
+         <xs:sequence>
+            <xs:element name="dress" maxOccurs="unbounded">
+               <xs:complexType>
+                  <xs:sequence>
+                     <xs:element name="set">
+                        <xs:complexType>
+                           <xs:attribute name="chest" type="xs:int"></xs:attribute>
+                           <xs:attribute name="legs" type="xs:int"></xs:attribute>
+                           <xs:attribute name="gloves" type="xs:int"></xs:attribute>
+                           <xs:attribute name="feet" type="xs:int"></xs:attribute>
+                        </xs:complexType>
+                     </xs:element>
+                     <xs:element name="price">
+                        <xs:complexType>
+                           <xs:attribute name="id" type="xs:int"></xs:attribute>
+                           <xs:attribute name="count" type="xs:int"></xs:attribute>
+                        </xs:complexType>
+                     </xs:element>
+                  </xs:sequence>
+                  <xs:attribute name="id" type="xs:int"></xs:attribute>
+                  <xs:attribute name="name" type="xs:string"></xs:attribute>
+                  <xs:attribute name="type" type="xs:string"></xs:attribute>
+               </xs:complexType>
+            </xs:element>
+         </xs:sequence>
+      </xs:complexType>
+   </xs:element>
+</xs:schema>
\ No newline at end of file
Index: dist/game/data/html/sunrise/dressme/index-hat.htm
===================================================================
--- dist/game/data/html/sunrise/dressme/index-hat.htm   (revision 0)
+++ dist/game/data/html/sunrise/dressme/index-hat.htm   (working copy)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<body scroll="no">
+<title>Dress me</title>
+<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="l2ui_ct1.Windows_DF_TooltipBG">
+   <tr>
+      <td valign="top">
+         <table width=290 height=330>
+            <tr>
+               <td width=270 height=40 align=center valign=top>
+                  <table border=0 cellspacing=2 cellpadding=4 width=270 height=40>
+                     <tr>
+                        <td FIXWIDTH=40 align=right valign=top>
+                           <table border=0 cellspacing=0 cellpadding=0 width=32 height=32 background="icon.etc_letter_in_bottle_red_i00">
+                              <tr>
+                                 <td width=32 align=center valign=top>
+                                    <img src="icon.panel_2" width="32" height="32">
+                                 </td>
+                              </tr>
+                           </table>
+                        </td>
+                        <td FIXWIDTH=170 align=left valign=top>
+                           <font color="CC3333">Visual change equip</font>
+                           <br1>› Information.
+                        </td>
+                        <td valign="top" align="center">
+                           <button action="bypass -h voice .dressinfo" width=32 height=32 back="L2UI_CT1.MiniMap_DF_PlusBtn_Gray_Down" fore="L2UI_CT1.MiniMap_DF_PlusBtn_Gray" />
+                        </td>
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center" height=222>
+                  <table width=270 height=46>
+                        {list}
+                  </table>
+               </td>
+            </tr>
+            <tr>
+               <td valign="top" align="center">
+                  <table width=50 height=30>
+                     <tr>
+                        {navigation}
+                     </tr>
+                  </table>
+               </td>
+            </tr>
+         </table>
+      </td>
+   </tr>
+</table>
+</body>
+</html>

CitarSQL

ALTER TABLE items ADD COLUMN `visual_item_id` int(7) NOT NULL DEFAULT '0' AFTER `time`;