View difference between Paste ID: immiiMaj and 965X2mTb
SHOW: | | - or go back to the newest paste.
1
### Eclipse Workspace Patch 1.0
2
#P aCis_gameserver405
3
diff --git config/players.properties config/players.properties
4
index c645204..99e7087 100644
5
--- config/players.properties
6
+++ config/players.properties
7
@@ -257,4 +257,16 @@
8
 MaxBuffsAmount = 20
9
 
10
 # Store buffs/debuffs on user logout. Default: True
11
-StoreSkillCooltime = True
12
\ No newline at end of file
13
+StoreSkillCooltime = True
14
+
15
+# DressMe system.
16
+AllowDressMeSystem = True
17
+
18
+# DressMe Command
19
+DressMeCommand = dressme
20
+
21
+# Only for premium account
22
+AllowDressMeForPremiumOnly = False
23
+
24
+
25
+# Players won't see the skins in Olympiad
26
+AllowDressMeInOly = True
27
\ No newline at end of file
28
diff --git java/Base/Skin/DressMeData.java java/Base/Skin/DressMeData.java
29
new file mode 100644
30
index 0000000..cdf1053
31
--- /dev/null
32
+++ java/Base/Skin/DressMeData.java
33
@@ -0,0 +1,216 @@
34
+package Base.Skin;
35
+
36
+import java.util.HashMap;
37
+import java.util.Map;
38
+import java.util.logging.Logger;
39
+
40
+import net.sf.l2j.commons.data.StatSet;
41
+
42
+import org.w3c.dom.Document;
43
+import org.w3c.dom.NamedNodeMap;
44
+import org.w3c.dom.Node;
45
+
46
+import Base.Xml.IXmlReader;
47
+
48
+
49
+
50
+public class DressMeData implements IXmlReader
51
+{
52
+	private static final Logger LOG = Logger.getLogger(DressMeData.class.getName());
53
+	
54
+	private final static Map<Integer, SkinPackage> _armorSkins = new HashMap<>();
55
+	private final static Map<Integer, SkinPackage> _weaponSkins = new HashMap<>();
56
+	private final static Map<Integer, SkinPackage> _hairSkins = new HashMap<>();
57
+	private final static Map<Integer, SkinPackage> _faceSkins = new HashMap<>();
58
+	private final static Map<Integer, SkinPackage> _shieldSkins = new HashMap<>();
59
+	
60
+	public DressMeData()
61
+	{
62
+		load();
63
+	}
64
+	
65
+	public void reload()
66
+	{
67
+		_armorSkins.clear();
68
+		_weaponSkins.clear();
69
+		_hairSkins.clear();
70
+		_faceSkins.clear();
71
+		_shieldSkins.clear();
72
+		
73
+		load();
74
+	}
75
+	
76
+	@Override
77
+	public void load()
78
+	{
79
+		parseDatapackFile("./data/xml/dressme.xml");
80
+		LOG.info(getClass().getSimpleName() + ": Loaded " + _armorSkins.size() + " armor skins");
81
+		LOG.info(getClass().getSimpleName() + ": Loaded " + _weaponSkins.size() + " weapon skins");
82
+		LOG.info(getClass().getSimpleName() + ": Loaded " + _hairSkins.size() + " hair skins");
83
+		LOG.info(getClass().getSimpleName() + ": Loaded " + _faceSkins.size() + " face skins");
84
+		LOG.info(getClass().getSimpleName() + ": Loaded " + _shieldSkins.size() + " shield skins");
85
+	}
86
+	
87
+	@Override
88
+	public void parseDocument(Document doc)
89
+	{
90
+		for (Node list = doc.getFirstChild(); list != null; list = list.getNextSibling())
91
+		{
92
+			if ("list".equalsIgnoreCase(list.getNodeName()))
93
+			{
94
+				for (Node skin = list.getFirstChild(); skin != null; skin = skin.getNextSibling())
95
+				{
96
+					if ("skin".equalsIgnoreCase(skin.getNodeName()))
97
+					{
98
+						final NamedNodeMap attrs = skin.getAttributes();
99
+						
100
+						String type = parseString(attrs, "type");
101
+						
102
+						final StatSet set = new StatSet();
103
+						
104
+						for (Node typeN = skin.getFirstChild(); typeN != null; typeN = typeN.getNextSibling())
105
+						{
106
+							if ("type".equalsIgnoreCase(typeN.getNodeName()))
107
+							{
108
+								final NamedNodeMap attrs2 = typeN.getAttributes();
109
+								
110
+								int id = parseInteger(attrs2, "id");
111
+								String name = parseString(attrs2, "name");
112
+								int weaponId = parseInteger(attrs2, "weaponId", 0);
113
+								int shieldId = parseInteger(attrs2, "shieldId", 0);
114
+								int chestId = parseInteger(attrs2, "chestId", 0);
115
+								int hairId = parseInteger(attrs2, "hairId", 0);
116
+								int faceId = parseInteger(attrs2, "faceId", 0);
117
+								int legsId = parseInteger(attrs2, "legsId", 0);
118
+								int glovesId = parseInteger(attrs2, "glovesId", 0);
119
+								int feetId = parseInteger(attrs2, "feetId", 0);
120
+								int priceId = parseInteger(attrs2, "priceId", 0);
121
+								int priceCount = parseInteger(attrs2, "priceCount", 0);
122
+								
123
+								set.set("type", type);
124
+								
125
+								set.set("id", id);
126
+								set.set("name", name);
127
+								set.set("weaponId", weaponId);
128
+								set.set("shieldId", shieldId);
129
+								set.set("chestId", chestId);
130
+								set.set("hairId", hairId);
131
+								set.set("faceId", faceId);
132
+								set.set("legsId", legsId);
133
+								set.set("glovesId", glovesId);
134
+								set.set("feetId", feetId);
135
+								set.set("priceId", priceId);
136
+								set.set("priceCount", priceCount);
137
+								
138
+								switch (type.toLowerCase())
139
+								{
140
+									case "armor":
141
+										_armorSkins.put(id, new SkinPackage(set));
142
+										break;
143
+									case "weapon":
144
+										_weaponSkins.put(id, new SkinPackage(set));
145
+										break;
146
+									case "hair":
147
+										_hairSkins.put(id, new SkinPackage(set));
148
+										break;
149
+									case "face":
150
+										_faceSkins.put(id, new SkinPackage(set));
151
+										break;
152
+									case "shield":
153
+										_shieldSkins.put(id, new SkinPackage(set));
154
+										break;
155
+								}
156
+							}
157
+						}
158
+					}
159
+				}
160
+			}
161
+		}
162
+		
163
+	}
164
+	
165
+	public SkinPackage getArmorSkinsPackage(int id)
166
+	{
167
+		if (!_armorSkins.containsKey(id))
168
+		{
169
+			return null;
170
+		}
171
+		
172
+		return _armorSkins.get(id);
173
+	}
174
+	
175
+	public Map<Integer, SkinPackage> getArmorSkinOptions()
176
+	{
177
+		return _armorSkins;
178
+	}
179
+	
180
+	public SkinPackage getWeaponSkinsPackage(int id)
181
+	{
182
+		if (!_weaponSkins.containsKey(id))
183
+		{
184
+			return null;
185
+		}
186
+		
187
+		return _weaponSkins.get(id);
188
+	}
189
+	
190
+	public Map<Integer, SkinPackage> getWeaponSkinOptions()
191
+	{
192
+		return _weaponSkins;
193
+	}
194
+	
195
+	public SkinPackage getHairSkinsPackage(int id)
196
+	{
197
+		if (!_hairSkins.containsKey(id))
198
+		{
199
+			return null;
200
+		}
201
+		
202
+		return _hairSkins.get(id);
203
+	}
204
+	
205
+	public Map<Integer, SkinPackage> getHairSkinOptions()
206
+	{
207
+		return _hairSkins;
208
+	}
209
+	
210
+	public SkinPackage getFaceSkinsPackage(int id)
211
+	{
212
+		if (!_faceSkins.containsKey(id))
213
+		{
214
+			return null;
215
+		}
216
+		
217
+		return _faceSkins.get(id);
218
+	}
219
+	
220
+	public Map<Integer, SkinPackage> getFaceSkinOptions()
221
+	{
222
+		return _faceSkins;
223
+	}
224
+	
225
+	public SkinPackage getShieldSkinsPackage(int id)
226
+	{
227
+		if (!_shieldSkins.containsKey(id))
228
+		{
229
+			return null;
230
+		}
231
+		
232
+		return _shieldSkins.get(id);
233
+	}
234
+	
235
+	public Map<Integer, SkinPackage> getShieldSkinOptions()
236
+	{
237
+		return _shieldSkins;
238
+	}
239
+	
240
+	public static DressMeData getInstance()
241
+	{
242
+		return SingletonHolder._instance;
243
+	}
244
+	
245
+	private static class SingletonHolder
246
+	{
247
+		protected static final DressMeData _instance = new DressMeData();
248
+	}
249
+}
250
\ No newline at end of file
251
diff --git java/Base/Skin/SkinPackage.java java/Base/Skin/SkinPackage.java
252
new file mode 100644
253
index 0000000..ff40f74
254
--- /dev/null
255
+++ java/Base/Skin/SkinPackage.java
256
@@ -0,0 +1,104 @@
257
+package Base.Skin;
258
+
259
+import net.sf.l2j.commons.data.StatSet;
260
+
261
+
262
+
263
+public class SkinPackage
264
+{
265
+	private String _type;
266
+	private String _name;
267
+	private int _id;
268
+	private int _weaponId;
269
+	private int _shieldId;
270
+	private int _chestId;
271
+	private int _hairId;
272
+	private int _faceId;
273
+	private int _legsId;
274
+	private int _glovesId;
275
+	private int _feetId;
276
+	private int _priceId;
277
+	private int _priceCount;
278
+	
279
+	public SkinPackage(StatSet set)
280
+	{
281
+		_type = set.getString("type", "default");
282
+		_name = set.getString("name", "NoName");
283
+		_id = set.getInteger("id", 0);
284
+		_weaponId = set.getInteger("weaponId", 0);
285
+		_shieldId = set.getInteger("shieldId", 0);
286
+		_chestId = set.getInteger("chestId", 0);
287
+		_hairId = set.getInteger("hairId", 0);
288
+		_faceId = set.getInteger("faceId", 0);
289
+		_legsId = set.getInteger("legsId", 0);
290
+		_glovesId = set.getInteger("glovesId", 0);
291
+		_feetId = set.getInteger("feetId", 0);
292
+		_priceId = set.getInteger("priceId", 0);
293
+		_priceCount = set.getInteger("priceCount", 0);
294
+	}
295
+	
296
+	public int getId()
297
+	{
298
+		return _id;
299
+	}
300
+	
301
+	public String getType()
302
+	{
303
+		return _type;
304
+	}
305
+	
306
+	public String getName()
307
+	{
308
+		return _name;
309
+	}
310
+	
311
+	public int getWeaponId()
312
+	{
313
+		return _weaponId;
314
+	}
315
+	
316
+	public int getShieldId()
317
+	{
318
+		return _shieldId;
319
+	}
320
+	
321
+	public int getChestId()
322
+	{
323
+		return _chestId;
324
+	}
325
+	
326
+	public int getHairId()
327
+	{
328
+		return _hairId;
329
+	}
330
+	
331
+	public int getFaceId()
332
+	{
333
+		return _faceId;
334
+	}
335
+	
336
+	public int getLegsId()
337
+	{
338
+		return _legsId;
339
+	}
340
+	
341
+	public int getGlovesId()
342
+	{
343
+		return _glovesId;
344
+	}
345
+	
346
+	public int getFeetId()
347
+	{
348
+		return _feetId;
349
+	}
350
+	
351
+	public int getPriceId()
352
+	{
353
+		return _priceId;
354
+	}
355
+	
356
+	public int getPriceCount()
357
+	{
358
+		return _priceCount;
359
+	}
360
+}
361
\ No newline at end of file
362
diff --git java/Base/Xml/IXmlReader.java java/Base/Xml/IXmlReader.java
363
new file mode 100644
364
index 0000000..044830c
365
--- /dev/null
366
+++ java/Base/Xml/IXmlReader.java
367
@@ -0,0 +1,577 @@
368
+
369
+package Base.Xml;
370
+
371
+import java.io.File;
372
+import java.io.FileFilter;
373
+import java.util.logging.Logger;
374
+
375
+import javax.xml.parsers.DocumentBuilder;
376
+import javax.xml.parsers.DocumentBuilderFactory;
377
+
378
+import net.sf.l2j.commons.data.StatSet;
379
+
380
+import net.sf.l2j.gameserver.GameServer;
381
+
382
+
383
+import org.w3c.dom.Document;
384
+import org.w3c.dom.NamedNodeMap;
385
+import org.w3c.dom.Node;
386
+import org.xml.sax.ErrorHandler;
387
+import org.xml.sax.SAXParseException;
388
+
389
+
390
+
391
+public interface IXmlReader
392
+{
393
+	static final Logger LOG = Logger.getLogger(GameServer.class.getName());
394
+	
395
+	static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
396
+	static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
397
+	
398
+	static final XMLFilter XML_FILTER = new XMLFilter();
399
+	
400
+	public void load();
401
+	
402
+	default void parseDatapackFile(String path)
403
+	{
404
+		parseFile(new File(".", path));
405
+	}
406
+	
407
+	default void parseFile(File f)
408
+	{
409
+		if (!getCurrentFileFilter().accept(f))
410
+		{
411
+			LOG.warning("{}: Could not parse {} is not a file or it doesn't exist!");
412
+			return;
413
+		}
414
+		
415
+		final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
416
+		dbf.setNamespaceAware(true);
417
+		dbf.setValidating(false);
418
+		dbf.setIgnoringComments(true);
419
+		
420
+		try
421
+		{
422
+			dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
423
+			final DocumentBuilder db = dbf.newDocumentBuilder();
424
+			db.setErrorHandler(new XMLErrorHandler());
425
+			parseDocument(db.parse(f), f);
426
+		}
427
+		catch (SAXParseException e)
428
+		{
429
+			LOG.warning("{}: Could not parse file {} at line {}, column {}");
430
+			return;
431
+		}
432
+		catch (Exception e)
433
+		{
434
+			LOG.warning("{}: Could not parse file {}");
435
+			return;
436
+		}
437
+	}
438
+	
439
+	default boolean parseDirectory(File file)
440
+	{
441
+		return parseDirectory(file, false);
442
+	}
443
+	
444
+	default boolean parseDirectory(String path)
445
+	{
446
+		return parseDirectory(new File(path), false);
447
+	}
448
+	
449
+	default boolean parseDirectory(String path, boolean recursive)
450
+	{
451
+		return parseDirectory(new File(path), recursive);
452
+	}
453
+	
454
+	default boolean parseDirectory(File dir, boolean recursive)
455
+	{
456
+		if (!dir.exists())
457
+		{
458
+			LOG.warning("{}: Folder {} doesn't exist!");
459
+			return false;
460
+		}
461
+		
462
+		final File[] files = dir.listFiles();
463
+		if (files != null)
464
+		{
465
+			for (File f : files)
466
+			{
467
+				if (recursive && f.isDirectory())
468
+				{
469
+					parseDirectory(f, recursive);
470
+				}
471
+				else if (getCurrentFileFilter().accept(f))
472
+				{
473
+					parseFile(f);
474
+				}
475
+			}
476
+		}
477
+		return true;
478
+	}
479
+	
480
+	default boolean parseDatapackDirectory(String path, boolean recursive)
481
+	{
482
+		return parseDirectory(new File(".", path), recursive);
483
+	}
484
+	
485
+	default void parseDocument(Document doc, File f)
486
+	{
487
+		parseDocument(doc);
488
+	}
489
+	
490
+	default void parseDocument(Document doc)
491
+	{
492
+		LOG.warning("{}: Parser not implemented!");
493
+	}
494
+	
495
+	default Boolean parseBoolean(Node node, Boolean defaultValue)
496
+	{
497
+		return node != null ? Boolean.valueOf(node.getNodeValue()) : defaultValue;
498
+	}
499
+	
500
+	default Boolean parseBoolean(Node node)
501
+	{
502
+		return parseBoolean(node, null);
503
+	}
504
+	
505
+	default Boolean parseBoolean(NamedNodeMap attrs, String name)
506
+	{
507
+		return parseBoolean(attrs.getNamedItem(name));
508
+	}
509
+	
510
+	default Boolean parseBoolean(NamedNodeMap attrs, String name, Boolean defaultValue)
511
+	{
512
+		return parseBoolean(attrs.getNamedItem(name), defaultValue);
513
+	}
514
+	
515
+	default Byte parseByte(Node node, Byte defaultValue)
516
+	{
517
+		return node != null ? Byte.valueOf(node.getNodeValue()) : defaultValue;
518
+	}
519
+	
520
+	default StatSet parseAttributes(Node node)
521
+	{
522
+		final NamedNodeMap attrs = node.getAttributes();
523
+		final StatSet map = new StatSet();
524
+		for (int i = 0; i < attrs.getLength(); i++)
525
+		{
526
+			final Node att = attrs.item(i);
527
+			map.set(att.getNodeName(), att.getNodeValue());
528
+		}
529
+		return map;
530
+	}
531
+	
532
+	/**
533
+	 * Parses a byte value.
534
+	 * @param node the node to parse
535
+	 * @return if the node is not null, the value of the parsed node, otherwise null
536
+	 */
537
+	default Byte parseByte(Node node)
538
+	{
539
+		return parseByte(node, null);
540
+	}
541
+	
542
+	/**
543
+	 * Parses a byte value.
544
+	 * @param attrs the attributes
545
+	 * @param name the name of the attribute to parse
546
+	 * @return if the node is not null, the value of the parsed node, otherwise null
547
+	 */
548
+	default Byte parseByte(NamedNodeMap attrs, String name)
549
+	{
550
+		return parseByte(attrs.getNamedItem(name));
551
+	}
552
+	
553
+	/**
554
+	 * Parses a byte value.
555
+	 * @param attrs the attributes
556
+	 * @param name the name of the attribute to parse
557
+	 * @param defaultValue the default value
558
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
559
+	 */
560
+	default Byte parseByte(NamedNodeMap attrs, String name, Byte defaultValue)
561
+	{
562
+		return parseByte(attrs.getNamedItem(name), defaultValue);
563
+	}
564
+	
565
+	/**
566
+	 * Parses a short value.
567
+	 * @param node the node to parse
568
+	 * @param defaultValue the default value
569
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
570
+	 */
571
+	default Short parseShort(Node node, Short defaultValue)
572
+	{
573
+		return node != null ? Short.valueOf(node.getNodeValue()) : defaultValue;
574
+	}
575
+	
576
+	/**
577
+	 * Parses a short value.
578
+	 * @param node the node to parse
579
+	 * @return if the node is not null, the value of the parsed node, otherwise null
580
+	 */
581
+	default Short parseShort(Node node)
582
+	{
583
+		return parseShort(node, null);
584
+	}
585
+	
586
+	/**
587
+	 * Parses a short value.
588
+	 * @param attrs the attributes
589
+	 * @param name the name of the attribute to parse
590
+	 * @return if the node is not null, the value of the parsed node, otherwise null
591
+	 */
592
+	default Short parseShort(NamedNodeMap attrs, String name)
593
+	{
594
+		return parseShort(attrs.getNamedItem(name));
595
+	}
596
+	
597
+	/**
598
+	 * Parses a short value.
599
+	 * @param attrs the attributes
600
+	 * @param name the name of the attribute to parse
601
+	 * @param defaultValue the default value
602
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
603
+	 */
604
+	default Short parseShort(NamedNodeMap attrs, String name, Short defaultValue)
605
+	{
606
+		return parseShort(attrs.getNamedItem(name), defaultValue);
607
+	}
608
+	
609
+	/**
610
+	 * Parses an int value.
611
+	 * @param node the node to parse
612
+	 * @param defaultValue the default value
613
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
614
+	 */
615
+	default int parseInt(Node node, Integer defaultValue)
616
+	{
617
+		return node != null ? Integer.parseInt(node.getNodeValue()) : defaultValue;
618
+	}
619
+	
620
+	/**
621
+	 * Parses an int value.
622
+	 * @param node the node to parse
623
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
624
+	 */
625
+	default int parseInt(Node node)
626
+	{
627
+		return parseInt(node, -1);
628
+	}
629
+	
630
+	/**
631
+	 * Parses an integer value.
632
+	 * @param node the node to parse
633
+	 * @param defaultValue the default value
634
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
635
+	 */
636
+	default Integer parseInteger(Node node, Integer defaultValue)
637
+	{
638
+		return node != null ? Integer.valueOf(node.getNodeValue()) : defaultValue;
639
+	}
640
+	
641
+	/**
642
+	 * Parses an integer value.
643
+	 * @param node the node to parse
644
+	 * @return if the node is not null, the value of the parsed node, otherwise null
645
+	 */
646
+	default Integer parseInteger(Node node)
647
+	{
648
+		return parseInteger(node, null);
649
+	}
650
+	
651
+	/**
652
+	 * Parses an integer value.
653
+	 * @param attrs the attributes
654
+	 * @param name the name of the attribute to parse
655
+	 * @return if the node is not null, the value of the parsed node, otherwise null
656
+	 */
657
+	default Integer parseInteger(NamedNodeMap attrs, String name)
658
+	{
659
+		return parseInteger(attrs.getNamedItem(name));
660
+	}
661
+	
662
+	/**
663
+	 * Parses an integer value.
664
+	 * @param attrs the attributes
665
+	 * @param name the name of the attribute to parse
666
+	 * @param defaultValue the default value
667
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
668
+	 */
669
+	default Integer parseInteger(NamedNodeMap attrs, String name, Integer defaultValue)
670
+	{
671
+		return parseInteger(attrs.getNamedItem(name), defaultValue);
672
+	}
673
+	
674
+	/**
675
+	 * Parses a long value.
676
+	 * @param node the node to parse
677
+	 * @param defaultValue the default value
678
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
679
+	 */
680
+	default Long parseLong(Node node, Long defaultValue)
681
+	{
682
+		return node != null ? Long.valueOf(node.getNodeValue()) : defaultValue;
683
+	}
684
+	
685
+	/**
686
+	 * Parses a long value.
687
+	 * @param node the node to parse
688
+	 * @return if the node is not null, the value of the parsed node, otherwise null
689
+	 */
690
+	default Long parseLong(Node node)
691
+	{
692
+		return parseLong(node, null);
693
+	}
694
+	
695
+	/**
696
+	 * Parses a long value.
697
+	 * @param attrs the attributes
698
+	 * @param name the name of the attribute to parse
699
+	 * @return if the node is not null, the value of the parsed node, otherwise null
700
+	 */
701
+	default Long parseLong(NamedNodeMap attrs, String name)
702
+	{
703
+		return parseLong(attrs.getNamedItem(name));
704
+	}
705
+	
706
+	/**
707
+	 * Parses a long value.
708
+	 * @param attrs the attributes
709
+	 * @param name the name of the attribute to parse
710
+	 * @param defaultValue the default value
711
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
712
+	 */
713
+	default Long parseLong(NamedNodeMap attrs, String name, Long defaultValue)
714
+	{
715
+		return parseLong(attrs.getNamedItem(name), defaultValue);
716
+	}
717
+	
718
+	/**
719
+	 * Parses a float value.
720
+	 * @param node the node to parse
721
+	 * @param defaultValue the default value
722
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
723
+	 */
724
+	default Float parseFloat(Node node, Float defaultValue)
725
+	{
726
+		return node != null ? Float.valueOf(node.getNodeValue()) : defaultValue;
727
+	}
728
+	
729
+	/**
730
+	 * Parses a float value.
731
+	 * @param node the node to parse
732
+	 * @return if the node is not null, the value of the parsed node, otherwise null
733
+	 */
734
+	default Float parseFloat(Node node)
735
+	{
736
+		return parseFloat(node, null);
737
+	}
738
+	
739
+	/**
740
+	 * Parses a float value.
741
+	 * @param attrs the attributes
742
+	 * @param name the name of the attribute to parse
743
+	 * @return if the node is not null, the value of the parsed node, otherwise null
744
+	 */
745
+	default Float parseFloat(NamedNodeMap attrs, String name)
746
+	{
747
+		return parseFloat(attrs.getNamedItem(name));
748
+	}
749
+	
750
+	/**
751
+	 * Parses a float value.
752
+	 * @param attrs the attributes
753
+	 * @param name the name of the attribute to parse
754
+	 * @param defaultValue the default value
755
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
756
+	 */
757
+	default Float parseFloat(NamedNodeMap attrs, String name, Float defaultValue)
758
+	{
759
+		return parseFloat(attrs.getNamedItem(name), defaultValue);
760
+	}
761
+	
762
+	/**
763
+	 * Parses a double value.
764
+	 * @param node the node to parse
765
+	 * @param defaultValue the default value
766
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
767
+	 */
768
+	default Double parseDouble(Node node, Double defaultValue)
769
+	{
770
+		return node != null ? Double.valueOf(node.getNodeValue()) : defaultValue;
771
+	}
772
+	
773
+	/**
774
+	 * Parses a double value.
775
+	 * @param node the node to parse
776
+	 * @return if the node is not null, the value of the parsed node, otherwise null
777
+	 */
778
+	default Double parseDouble(Node node)
779
+	{
780
+		return parseDouble(node, null);
781
+	}
782
+	
783
+	/**
784
+	 * Parses a double value.
785
+	 * @param attrs the attributes
786
+	 * @param name the name of the attribute to parse
787
+	 * @return if the node is not null, the value of the parsed node, otherwise null
788
+	 */
789
+	default Double parseDouble(NamedNodeMap attrs, String name)
790
+	{
791
+		return parseDouble(attrs.getNamedItem(name));
792
+	}
793
+	
794
+	/**
795
+	 * Parses a double value.
796
+	 * @param attrs the attributes
797
+	 * @param name the name of the attribute to parse
798
+	 * @param defaultValue the default value
799
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
800
+	 */
801
+	default Double parseDouble(NamedNodeMap attrs, String name, Double defaultValue)
802
+	{
803
+		return parseDouble(attrs.getNamedItem(name), defaultValue);
804
+	}
805
+	
806
+	/**
807
+	 * Parses a string value.
808
+	 * @param node the node to parse
809
+	 * @param defaultValue the default value
810
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
811
+	 */
812
+	default String parseString(Node node, String defaultValue)
813
+	{
814
+		return node != null ? node.getNodeValue() : defaultValue;
815
+	}
816
+	
817
+	/**
818
+	 * Parses a string value.
819
+	 * @param node the node to parse
820
+	 * @return if the node is not null, the value of the parsed node, otherwise null
821
+	 */
822
+	default String parseString(Node node)
823
+	{
824
+		return parseString(node, null);
825
+	}
826
+	
827
+	/**
828
+	 * Parses a string value.
829
+	 * @param attrs the attributes
830
+	 * @param name the name of the attribute to parse
831
+	 * @return if the node is not null, the value of the parsed node, otherwise null
832
+	 */
833
+	default String parseString(NamedNodeMap attrs, String name)
834
+	{
835
+		return parseString(attrs.getNamedItem(name));
836
+	}
837
+	
838
+	/**
839
+	 * Parses a string value.
840
+	 * @param attrs the attributes
841
+	 * @param name the name of the attribute to parse
842
+	 * @param defaultValue the default value
843
+	 * @return if the node is not null, the value of the parsed node, otherwise the default value
844
+	 */
845
+	default String parseString(NamedNodeMap attrs, String name, String defaultValue)
846
+	{
847
+		return parseString(attrs.getNamedItem(name), defaultValue);
848
+	}
849
+	
850
+	/**
851
+	 * Parses an enumerated value.
852
+	 * @param <T> the enumerated type
853
+	 * @param node the node to parse
854
+	 * @param clazz the class of the enumerated
855
+	 * @param defaultValue the default value
856
+	 * @return if the node is not null and the node value is valid the parsed value, otherwise the default value
857
+	 */
858
+	default <T extends Enum<T>> T parseEnum(Node node, Class<T> clazz, T defaultValue)
859
+	{
860
+		if (node == null)
861
+		{
862
+			return defaultValue;
863
+		}
864
+		
865
+		try
866
+		{
867
+			return Enum.valueOf(clazz, node.getNodeValue());
868
+		}
869
+		catch (IllegalArgumentException e)
870
+		{
871
+			LOG.warning("Invalid value specified for node: {} specified value: {} should be enum value of \"{}\" using default value: {}");
872
+			return defaultValue;
873
+		}
874
+	}
875
+	
876
+	/**
877
+	 * Parses an enumerated value.
878
+	 * @param <T> the enumerated type
879
+	 * @param node the node to parse
880
+	 * @param clazz the class of the enumerated
881
+	 * @return if the node is not null and the node value is valid the parsed value, otherwise null
882
+	 */
883
+	default <T extends Enum<T>> T parseEnum(Node node, Class<T> clazz)
884
+	{
885
+		return parseEnum(node, clazz, null);
886
+	}
887
+	
888
+	/**
889
+	 * Parses an enumerated value.
890
+	 * @param <T> the enumerated type
891
+	 * @param attrs the attributes
892
+	 * @param clazz the class of the enumerated
893
+	 * @param name the name of the attribute to parse
894
+	 * @return if the node is not null and the node value is valid the parsed value, otherwise null
895
+	 */
896
+	default <T extends Enum<T>> T parseEnum(NamedNodeMap attrs, Class<T> clazz, String name)
897
+	{
898
+		return parseEnum(attrs.getNamedItem(name), clazz);
899
+	}
900
+	
901
+	/**
902
+	 * Parses an enumerated value.
903
+	 * @param <T> the enumerated type
904
+	 * @param attrs the attributes
905
+	 * @param clazz the class of the enumerated
906
+	 * @param name the name of the attribute to parse
907
+	 * @param defaultValue the default value
908
+	 * @return if the node is not null and the node value is valid the parsed value, otherwise the default value
909
+	 */
910
+	default <T extends Enum<T>> T parseEnum(NamedNodeMap attrs, Class<T> clazz, String name, T defaultValue)
911
+	{
912
+		return parseEnum(attrs.getNamedItem(name), clazz, defaultValue);
913
+	}
914
+	
915
+	/**
916
+	 * Gets the current file filter.
917
+	 * @return the current file filter
918
+	 */
919
+	default FileFilter getCurrentFileFilter()
920
+	{
921
+		return XML_FILTER;
922
+	}
923
+	
924
+	static class XMLErrorHandler implements ErrorHandler
925
+	{
926
+		@Override
927
+		public void warning(SAXParseException e) throws SAXParseException
928
+		{
929
+			throw e;
930
+		}
931
+		
932
+		@Override
933
+		public void error(SAXParseException e) throws SAXParseException
934
+		{
935
+			throw e;
936
+		}
937
+		
938
+		@Override
939
+		public void fatalError(SAXParseException e) throws SAXParseException
940
+		{
941
+			throw e;
942
+		}
943
+	}
944
+}
945
diff --git java/Base/Xml/XMLFilter.java java/Base/Xml/XMLFilter.java
946
new file mode 100644
947
index 0000000..faa1805
948
--- /dev/null
949
+++ java/Base/Xml/XMLFilter.java
950
@@ -0,0 +1,17 @@
951
+package Base.Xml;
952
+
953
+import java.io.File;
954
+import java.io.FileFilter;
955
+
956
+public class XMLFilter implements FileFilter
957
+{
958
+	@Override
959
+	public boolean accept(File f)
960
+	{
961
+		if ((f == null) || !f.isFile())
962
+		{
963
+			return false;
964
+		}
965
+		return f.getName().toLowerCase().endsWith(".xml");
966
+	}
967
+}
968
diff --git java/net/sf/l2j/Config.java java/net/sf/l2j/Config.java
969
index 5fb661c..a0fde2e 100644
970
--- java/net/sf/l2j/Config.java
971
+++ java/net/sf/l2j/Config.java
972
@@ -36,6 +36,15 @@
973
 	public static final String SERVER_FILE = "./config/server.properties";
974
 	public static final String SIEGE_FILE = "./config/siege.properties";
975
 	
976
+	
977
+	
978
+			public static boolean ALLOW_DRESS_ME_SYSTEM;
979
+			public static String DRESS_ME_COMMAND;
980
+			public static boolean ALLOW_DRESS_ME_FOR_PREMIUM;
981
+			public static boolean ALLOW_DRESS_ME_IN_OLY;
982
+	
983
+	
984
+	
985
 	// --------------------------------------------------
986
 	// Clans settings
987
 	// --------------------------------------------------
988
@@ -943,6 +952,14 @@
989
 		final ExProperties players = initProperties(PLAYERS_FILE);
990
 		
991
 		EFFECT_CANCELING = players.getProperty("CancelLesserEffect", true);
992
+		
993
+						ALLOW_DRESS_ME_SYSTEM = players.getProperty("AllowDressMeSystem", false);
994
+						DRESS_ME_COMMAND = players.getProperty("DressMeCommand", "dressme");
995
+						ALLOW_DRESS_ME_FOR_PREMIUM = players.getProperty("AllowDressMeForPremiumOnly", false);
996
+						ALLOW_DRESS_ME_IN_OLY = players.getProperty("AllowDressMeInOly", false);	
997
+		
998
+		
999
+		
1000
 		HP_REGEN_MULTIPLIER = players.getProperty("HpRegenMultiplier", 1.);
1001
 		MP_REGEN_MULTIPLIER = players.getProperty("MpRegenMultiplier", 1.);
1002
 		CP_REGEN_MULTIPLIER = players.getProperty("CpRegenMultiplier", 1.);
1003
diff --git java/net/sf/l2j/gameserver/GameServer.java java/net/sf/l2j/gameserver/GameServer.java
1004
index 2d0b8e7..29763e0 100644
1005
--- java/net/sf/l2j/gameserver/GameServer.java
1006
+++ java/net/sf/l2j/gameserver/GameServer.java
1007
@@ -78,6 +78,7 @@
1008
 import net.sf.l2j.gameserver.handler.SkillHandler;
1009
 import net.sf.l2j.gameserver.handler.TargetHandler;
1010
 import net.sf.l2j.gameserver.handler.UserCommandHandler;
1011
+import net.sf.l2j.gameserver.handler.VoicedCommandHandler;
1012
 import net.sf.l2j.gameserver.idfactory.IdFactory;
1013
 import net.sf.l2j.gameserver.model.World;
1014
 import net.sf.l2j.gameserver.model.boat.BoatGiranTalking;
1015
@@ -85,6 +86,7 @@
1016
 import net.sf.l2j.gameserver.model.boat.BoatInnadrilTour;
1017
 import net.sf.l2j.gameserver.model.boat.BoatRunePrimeval;
1018
 import net.sf.l2j.gameserver.model.boat.BoatTalkingGludin;
1019
+import net.sf.l2j.gameserver.model.item.kind.Item;
1020
 import net.sf.l2j.gameserver.model.olympiad.Olympiad;
1021
 import net.sf.l2j.gameserver.model.olympiad.OlympiadGameManager;
1022
 import net.sf.l2j.gameserver.network.GameClient;
1023
@@ -100,6 +102,8 @@
1024
 import net.sf.l2j.util.DeadLockDetector;
1025
 import net.sf.l2j.util.IPv4Filter;
1026
 
1027
+import Base.Skin.DressMeData;
1028
+
1029
 public class GameServer
1030
 {
1031
 	private static final CLogger LOGGER = new CLogger(GameServer.class.getName());
1032
@@ -269,10 +273,26 @@
1033
 		LOGGER.info("Loaded {} skill handlers.", SkillHandler.getInstance().size());
1034
 		LOGGER.info("Loaded {} target handlers.", TargetHandler.getInstance().size());
1035
 		LOGGER.info("Loaded {} user command handlers.", UserCommandHandler.getInstance().size());
1036
-		
1037
+		LOGGER.info("Loaded {} user VoicedCommandHandler handlers.", VoicedCommandHandler.getInstance().size());		
1038
 		StringUtil.printSection("System");
1039
 		Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
1040
 		
1041
+		
1042
+				Item.LoadAllIcons();
1043
+				
1044
+				if (Config.ALLOW_DRESS_ME_SYSTEM)
1045
+				{
1046
+					StringUtil.printSection("Dress Me / Skins");
1047
+					DressMeData.getInstance();
1048
+				}
1049
+				
1050
+				
1051
+				
1052
+				
1053
+		
1054
+		
1055
+		
1056
+		
1057
 		if (Config.DEADLOCK_DETECTOR)
1058
 		{
1059
 			LOGGER.info("Deadlock detector is enabled. Timer: {}s.", Config.DEADLOCK_CHECK_INTERVAL);
1060
diff --git java/net/sf/l2j/gameserver/data/xml/ItemData.java java/net/sf/l2j/gameserver/data/xml/ItemData.java
1061
index 4cadc26..15ef358 100644
1062
--- java/net/sf/l2j/gameserver/data/xml/ItemData.java
1063
+++ java/net/sf/l2j/gameserver/data/xml/ItemData.java
1064
@@ -3,10 +3,13 @@
1065
 import java.io.File;
1066
 import java.util.HashMap;
1067
 import java.util.Map;
1068
+import java.util.logging.Level;
1069
 
1070
 import net.sf.l2j.commons.logging.CLogger;
1071
 
1072
+
1073
 import net.sf.l2j.gameserver.data.DocumentItem;
1074
+import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
1075
 import net.sf.l2j.gameserver.model.item.kind.Armor;
1076
 import net.sf.l2j.gameserver.model.item.kind.EtcItem;
1077
 import net.sf.l2j.gameserver.model.item.kind.Item;
1078
@@ -88,6 +91,47 @@
1079
 		return SingletonHolder.INSTANCE;
1080
 	}
1081
 	
1082
+	
1083
+	
1084
+	
1085
+	
1086
+	public ItemInstance createDummyItem(final int itemId)
1087
+	{
1088
+		final Item item = getTemplate(itemId);
1089
+		
1090
+		if (item == null)
1091
+		{
1092
+			return null;
1093
+		}
1094
+		
1095
+		ItemInstance temp = new ItemInstance(0, item);
1096
+		
1097
+		try
1098
+		{
1099
+			temp = new ItemInstance(0, itemId);
1100
+		}
1101
+		catch (final ArrayIndexOutOfBoundsException e)
1102
+		{
1103
+	
1104
+				e.printStackTrace();
1105
+			
1106
+		}
1107
+		
1108
+		if (temp.getItem() == null)
1109
+		{
1110
+			LOGGER.warn(Level.WARNING, "ItemTable: Item Template missing for Id: {}" + " " + itemId);
1111
+		}
1112
+		
1113
+		return temp;
1114
+	}	
1115
+	
1116
+	
1117
+	
1118
+	
1119
+	
1120
+	
1121
+	
1122
+	
1123
 	private static class SingletonHolder
1124
 	{
1125
 		protected static final ItemData INSTANCE = new ItemData();
1126
diff --git java/net/sf/l2j/gameserver/handler/BypassHandler.java java/net/sf/l2j/gameserver/handler/BypassHandler.java
1127
new file mode 100644
1128
index 0000000..ad2fbd4
1129
--- /dev/null
1130
+++ java/net/sf/l2j/gameserver/handler/BypassHandler.java
1131
@@ -0,0 +1,69 @@
1132
+package net.sf.l2j.gameserver.handler;
1133
+
1134
+import java.util.HashMap;
1135
+import java.util.Map;
1136
+import java.util.logging.Logger;
1137
+
1138
+import net.sf.l2j.Config;
1139
+
1140
+
1141
+
1142
+/**
1143
+ * @author Dwight
1144
+ */
1145
+public class BypassHandler
1146
+{
1147
+	private static Logger _log = Logger.getLogger(BypassHandler.class.getName());
1148
+	private final Map<Integer, IBypassHandler> _datatable = new HashMap<>();
1149
+	
1150
+	public static BypassHandler getInstance()
1151
+	{
1152
+		return SingletonHolder._instance;
1153
+	}
1154
+	
1155
+	private BypassHandler()
1156
+	{
1157
+		
1158
+	
1159
+		
1160
+	}
1161
+	
1162
+	public void registerBypassHandler(IBypassHandler handler)
1163
+	{
1164
+		String[] ids = handler.getBypassHandlersList();
1165
+		for (int i = 0; i < ids.length; i++)
1166
+		{
1167
+			if (Config.PACKET_HANDLER_DEBUG)
1168
+			{
1169
+				_log.fine("Adding handler for command " + ids[i]);
1170
+			}
1171
+			_datatable.put(ids[i].hashCode(), handler);
1172
+		}
1173
+	}
1174
+	
1175
+	public IBypassHandler getBypassHandler(String bypass)
1176
+	{
1177
+		String command = bypass;
1178
+		
1179
+		if (bypass.indexOf(" ") != -1)
1180
+		{
1181
+			command = bypass.substring(0, bypass.indexOf(" "));
1182
+		}
1183
+		
1184
+		if (Config.PACKET_HANDLER_DEBUG)
1185
+		{
1186
+			_log.fine("getting handler for command: " + command + " -> " + (_datatable.get(command.hashCode()) != null));
1187
+		}
1188
+		return _datatable.get(command.hashCode());
1189
+	}
1190
+	
1191
+	public int size()
1192
+	{
1193
+		return _datatable.size();
1194
+	}
1195
+	
1196
+	private static class SingletonHolder
1197
+	{
1198
+		protected static final BypassHandler _instance = new BypassHandler();
1199
+	}
1200
+}
1201
diff --git java/net/sf/l2j/gameserver/handler/CustomBypassHandler.java java/net/sf/l2j/gameserver/handler/CustomBypassHandler.java
1202
new file mode 100644
1203
index 0000000..e07fdff
1204
--- /dev/null
1205
+++ java/net/sf/l2j/gameserver/handler/CustomBypassHandler.java
1206
@@ -0,0 +1,70 @@
1207
+
1208
+package net.sf.l2j.gameserver.handler;
1209
+
1210
+import java.util.HashMap;
1211
+import java.util.Map;
1212
+
1213
+import net.sf.l2j.gameserver.handler.usercommandhandlers.DressMe;
1214
+import net.sf.l2j.gameserver.model.actor.Player;
1215
+
1216
+
1217
+
1218
+
1219
+public class CustomBypassHandler
1220
+{
1221
+
1222
+	
1223
+	private static CustomBypassHandler _instance = null;
1224
+	private final Map<String, ICustomByPassHandler> _handlers;
1225
+	
1226
+	private CustomBypassHandler()
1227
+	{
1228
+		_handlers = new HashMap<>();
1229
+		
1230
+		
1231
+		registerCustomBypassHandler(new DressMe());
1232
+	}
1233
+	
1234
+	public static CustomBypassHandler getInstance()
1235
+	{
1236
+		if (_instance == null)
1237
+		{
1238
+			_instance = new CustomBypassHandler();
1239
+		}
1240
+		
1241
+		return _instance;
1242
+	}
1243
+	
1244
+	public void registerCustomBypassHandler(final ICustomByPassHandler handler)
1245
+	{
1246
+		for (final String s : handler.getByPassCommands())
1247
+		{
1248
+			_handlers.put(s, handler);
1249
+		}
1250
+	}
1251
+	
1252
+	public void handleBypass(final Player player, final String command)
1253
+	{
1254
+		String cmd = "";
1255
+		String params = "";
1256
+		final int iPos = command.indexOf(" ");
1257
+		if (iPos != -1)
1258
+		{
1259
+			cmd = command.substring(7, iPos);
1260
+			params = command.substring(iPos + 1);
1261
+		}
1262
+		else
1263
+		{
1264
+			cmd = command.substring(7);
1265
+		}
1266
+		final ICustomByPassHandler ch = _handlers.get(cmd);
1267
+		if (ch != null)
1268
+		{
1269
+			ch.handleCommand(cmd, player, params);
1270
+		}
1271
+		else
1272
+		{
1273
+
1274
+		}
1275
+	}
1276
+}
1277
\ No newline at end of file
1278
diff --git java/net/sf/l2j/gameserver/handler/IBypassHandler.java java/net/sf/l2j/gameserver/handler/IBypassHandler.java
1279
new file mode 100644
1280
index 0000000..a942b63
1281
--- /dev/null
1282
+++ java/net/sf/l2j/gameserver/handler/IBypassHandler.java
1283
@@ -0,0 +1,13 @@
1284
+package net.sf.l2j.gameserver.handler;
1285
+
1286
+import net.sf.l2j.gameserver.model.actor.Player;
1287
+
1288
+/**
1289
+ * @author Dwight
1290
+ */
1291
+public interface IBypassHandler
1292
+{
1293
+	public boolean handleBypass(String bypass, Player activeChar);
1294
+	
1295
+	public String[] getBypassHandlersList();
1296
+}
1297
diff --git java/net/sf/l2j/gameserver/handler/ICustomByPassHandler.java java/net/sf/l2j/gameserver/handler/ICustomByPassHandler.java
1298
new file mode 100644
1299
index 0000000..6b4c1b4
1300
--- /dev/null
1301
+++ java/net/sf/l2j/gameserver/handler/ICustomByPassHandler.java
1302
@@ -0,0 +1,10 @@
1303
+package net.sf.l2j.gameserver.handler;
1304
+
1305
+import net.sf.l2j.gameserver.model.actor.Player;
1306
+
1307
+public interface ICustomByPassHandler
1308
+{
1309
+	public String[] getByPassCommands();
1310
+	
1311
+	public void handleCommand(String command, Player player, String parameters);
1312
+}
1313
diff --git java/net/sf/l2j/gameserver/handler/IVoicedCommandHandler.java java/net/sf/l2j/gameserver/handler/IVoicedCommandHandler.java
1314
new file mode 100644
1315
index 0000000..3b0f12a
1316
--- /dev/null
1317
+++ java/net/sf/l2j/gameserver/handler/IVoicedCommandHandler.java
1318
@@ -0,0 +1,10 @@
1319
+package net.sf.l2j.gameserver.handler;
1320
+
1321
+import net.sf.l2j.gameserver.model.actor.Player;
1322
+
1323
+public interface IVoicedCommandHandler
1324
+{
1325
+	public boolean useVoicedCommand(String command, Player activeChar, String params);
1326
+	
1327
+	public String[] getVoicedCommandList();
1328
+}
1329
\ No newline at end of file
1330
diff --git java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java
1331
new file mode 100644
1332
index 0000000..35df73c
1333
--- /dev/null
1334
+++ java/net/sf/l2j/gameserver/handler/VoicedCommandHandler.java
1335
@@ -0,0 +1,51 @@
1336
+package net.sf.l2j.gameserver.handler;
1337
+
1338
+import java.util.HashMap;
1339
+import java.util.Map;
1340
+
1341
+import net.sf.l2j.gameserver.handler.usercommandhandlers.DressMe;
1342
+
1343
+public class VoicedCommandHandler
1344
+{
1345
+	private final Map<Integer, IVoicedCommandHandler> _datatable = new HashMap<>();
1346
+	
1347
+	public static VoicedCommandHandler getInstance()
1348
+	{
1349
+		return SingletonHolder._instance;
1350
+	}
1351
+	
1352
+	protected VoicedCommandHandler()
1353
+	{
1354
+		//Codigos para colocar aqui dentro
1355
+		registerHandler(new DressMe());
1356
+		
1357
+	}
1358
+	
1359
+	public void registerHandler(IVoicedCommandHandler handler)
1360
+	{
1361
+		String[] ids = handler.getVoicedCommandList();
1362
+		
1363
+		for (int i = 0; i < ids.length; i++)
1364
+			_datatable.put(ids[i].hashCode(), handler);
1365
+	}
1366
+	
1367
+	public IVoicedCommandHandler getHandler(String voicedCommand)
1368
+	{
1369
+		String command = voicedCommand;
1370
+		
1371
+		if (voicedCommand.indexOf(" ") != -1)
1372
+			command = voicedCommand.substring(0, voicedCommand.indexOf(" "));
1373
+		
1374
+		return _datatable.get(command.hashCode());
1375
+	}
1376
+	
1377
+	public int size()
1378
+	{
1379
+		return _datatable.size();
1380
+	}
1381
+	
1382
+	private static class SingletonHolder
1383
+	{
1384
+		protected static final VoicedCommandHandler _instance = new VoicedCommandHandler();
1385
+	}
1386
+}
1387
\ No newline at end of file
1388
diff --git java/net/sf/l2j/gameserver/handler/chathandlers/ChatAll.java java/net/sf/l2j/gameserver/handler/chathandlers/ChatAll.java
1389
index ac326e9..2bcda59 100644
1390
--- java/net/sf/l2j/gameserver/handler/chathandlers/ChatAll.java
1391
+++ java/net/sf/l2j/gameserver/handler/chathandlers/ChatAll.java
1392
@@ -1,8 +1,12 @@
1393
 package net.sf.l2j.gameserver.handler.chathandlers;
1394
 
1395
+import java.util.StringTokenizer;
1396
+
1397
 import net.sf.l2j.gameserver.enums.FloodProtector;
1398
 import net.sf.l2j.gameserver.enums.SayType;
1399
 import net.sf.l2j.gameserver.handler.IChatHandler;
1400
+import net.sf.l2j.gameserver.handler.IVoicedCommandHandler;
1401
+import net.sf.l2j.gameserver.handler.VoicedCommandHandler;
1402
 import net.sf.l2j.gameserver.model.actor.Player;
1403
 import net.sf.l2j.gameserver.network.serverpackets.CreatureSay;
1404
 
1405
@@ -19,11 +23,39 @@
1406
 		if (!player.getClient().performAction(FloodProtector.GLOBAL_CHAT))
1407
 			return;
1408
 		
1409
-		final CreatureSay cs = new CreatureSay(player, type, text);
1410
-		for (Player knownPlayer : player.getKnownTypeInRadius(Player.class, 1250))
1411
-			knownPlayer.sendPacket(cs);
1412
+				boolean vcd_used = false;
1413
+				if (text.startsWith("."))
1414
+				{
1415
+					StringTokenizer st = new StringTokenizer(text);
1416
+					IVoicedCommandHandler vch;
1417
+					String command = "";
1418
+					if (st.countTokens() > 1)
1419
+					{
1420
+						command = st.nextToken().substring(1);
1421
+						target = text.substring(command.length() + 2);
1422
+						vch = VoicedCommandHandler.getInstance().getHandler(command);
1423
+					}
1424
+					else
1425
+					{
1426
+						command = text.substring(1);
1427
+						vch = VoicedCommandHandler.getInstance().getHandler(command);
1428
+					}
1429
 		
1430
-		player.sendPacket(cs);
1431
+					if (vch != null)
1432
+					{
1433
+						vch.useVoicedCommand(command, player, text);
1434
+						vcd_used = true;
1435
+		
1436
+					}
1437
+				}
1438
+				if (!vcd_used)
1439
+				{
1440
+					final CreatureSay cs = new CreatureSay(player, type, text);
1441
+					for (Player knownPlayer : player.getKnownTypeInRadius(Player.class, 1250))
1442
+						knownPlayer.sendPacket(cs);
1443
+		
1444
+					player.sendPacket(cs);
1445
+				}
1446
 	}
1447
 	
1448
 	@Override
1449
diff --git java/net/sf/l2j/gameserver/handler/usercommandhandlers/DressMe.java java/net/sf/l2j/gameserver/handler/usercommandhandlers/DressMe.java
1450
new file mode 100644
1451
index 0000000..56c1309
1452
--- /dev/null
1453
+++ java/net/sf/l2j/gameserver/handler/usercommandhandlers/DressMe.java
1454
@@ -0,0 +1,93 @@
1455
+package net.sf.l2j.gameserver.handler.usercommandhandlers;
1456
+
1457
+import java.text.SimpleDateFormat;
1458
+import java.util.Date;
1459
+
1460
+import net.sf.l2j.Config;
1461
+import net.sf.l2j.gameserver.data.cache.HtmCache;
1462
+import net.sf.l2j.gameserver.handler.ICustomByPassHandler;
1463
+import net.sf.l2j.gameserver.handler.IVoicedCommandHandler;
1464
+import net.sf.l2j.gameserver.model.actor.Player;
1465
+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
1466
+
1467
+
1468
+
1469
+public class DressMe implements IVoicedCommandHandler, ICustomByPassHandler
1470
+{
1471
+	private static String[] _voicedCommands =
1472
+	{
1473
+		Config.DRESS_ME_COMMAND
1474
+	};
1475
+	
1476
+	@Override
1477
+	public boolean useVoicedCommand(String command, Player activeChar, String target)
1478
+	{
1479
+
1480
+		
1481
+		if (command.startsWith(Config.DRESS_ME_COMMAND))
1482
+		{
1483
+			showHtm(activeChar);
1484
+		}
1485
+		
1486
+
1487
+		return true;
1488
+	}
1489
+	
1490
+	private static void showHtm(Player player)
1491
+	{
1492
+		NpcHtmlMessage htm = new NpcHtmlMessage(1);
1493
+		String text = HtmCache.getInstance().getHtm("data/html/dressme/index.htm");
1494
+		
1495
+		htm.setHtml(text);
1496
+		
1497
+		{
1498
+			htm.replace("%time%", sdf.format(new Date(System.currentTimeMillis())));
1499
+			htm.replace("%dat%", (new SimpleDateFormat("dd/MM/yyyy")).format(new Date(System.currentTimeMillis())));
1500
+			
1501
+		}
1502
+		
1503
+		player.sendPacket(htm);
1504
+	}
1505
+	
1506
+	static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
1507
+	
1508
+	@Override
1509
+	public String[] getVoicedCommandList()
1510
+	{
1511
+		return _voicedCommands;
1512
+	}
1513
+	
1514
+	@Override
1515
+	public String[] getByPassCommands()
1516
+	{
1517
+		return new String[]
1518
+		{
1519
+			"dressme_back"
1520
+		};
1521
+	}
1522
+	
1523
+	private enum CommandEnum
1524
+	{
1525
+		dressme_back,
1526
+	}
1527
+	
1528
+	@Override
1529
+	public void handleCommand(String command, Player player, String parameters)
1530
+	{
1531
+		CommandEnum comm = CommandEnum.valueOf(command);
1532
+		
1533
+		if (comm == null)
1534
+		{
1535
+			return;
1536
+		}
1537
+		
1538
+		switch (comm)
1539
+		{
1540
+			case dressme_back:
1541
+			{
1542
+				showHtm(player);
1543
+			}
1544
+				break;
1545
+		}
1546
+	}
1547
+}
1548
\ No newline at end of file
1549
diff --git java/net/sf/l2j/gameserver/model/actor/Player.java java/net/sf/l2j/gameserver/model/actor/Player.java
1550
index 172649c..8610748 100644
1551
--- java/net/sf/l2j/gameserver/model/actor/Player.java
1552
+++ java/net/sf/l2j/gameserver/model/actor/Player.java
1553
@@ -14,6 +14,7 @@
1554
 import java.util.Set;
1555
 import java.util.concurrent.ConcurrentHashMap;
1556
 import java.util.concurrent.ConcurrentSkipListMap;
1557
+import java.util.concurrent.CopyOnWriteArrayList;
1558
 import java.util.concurrent.Future;
1559
 import java.util.concurrent.ScheduledFuture;
1560
 import java.util.concurrent.atomic.AtomicInteger;
1561
@@ -163,6 +164,7 @@
1562
 import net.sf.l2j.gameserver.network.serverpackets.ExOlympiadMode;
1563
 import net.sf.l2j.gameserver.network.serverpackets.ExServerPrimitive;
1564
 import net.sf.l2j.gameserver.network.serverpackets.ExSetCompassZoneCode;
1565
+import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage;
1566
 import net.sf.l2j.gameserver.network.serverpackets.ExStorageMaxCount;
1567
 import net.sf.l2j.gameserver.network.serverpackets.GetOnVehicle;
1568
 import net.sf.l2j.gameserver.network.serverpackets.HennaInfo;
1569
@@ -177,6 +179,7 @@
1570
 import net.sf.l2j.gameserver.network.serverpackets.ObserverStart;
1571
 import net.sf.l2j.gameserver.network.serverpackets.PartySmallWindowUpdate;
1572
 import net.sf.l2j.gameserver.network.serverpackets.PetInventoryUpdate;
1573
+import net.sf.l2j.gameserver.network.serverpackets.PlaySound;
1574
 import net.sf.l2j.gameserver.network.serverpackets.PledgeShowMemberListDelete;
1575
 import net.sf.l2j.gameserver.network.serverpackets.PledgeShowMemberListUpdate;
1576
 import net.sf.l2j.gameserver.network.serverpackets.PrivateStoreListBuy;
1577
@@ -225,12 +228,48 @@
1578
 import net.sf.l2j.gameserver.taskmanager.ShadowItemTaskManager;
1579
 import net.sf.l2j.gameserver.taskmanager.WaterTaskManager;
1580
 
1581
+import Base.Skin.DressMeData;
1582
+
1583
 /**
1584
  * This class represents a player in the world.<br>
1585
  * There is always a client-thread connected to this (except if a player-store is activated upon logout).
1586
  */
1587
 public final class Player extends Playable
1588
 {
1589
+	
1590
+	
1591
+	
1592
+		
1593
+		private int _armorSkinOption = 0;
1594
+		private int _weaponSkinOption = 0;
1595
+		private int _hairSkinOption = 0;
1596
+		private int _faceSkinOption = 0;
1597
+		private int _shieldSkinOption = 0;
1598
+	
1599
+	
1600
+		private boolean isTryingSkin = false;
1601
+		private boolean isTryingSkinPremium = false;
1602
+		private List<Integer> _armorSkins = new CopyOnWriteArrayList<>();
1603
+		private List<Integer> _weaponSkins = new CopyOnWriteArrayList<>();
1604
+		private List<Integer> _hairSkins = new CopyOnWriteArrayList<>();
1605
+		private List<Integer> _faceSkins = new CopyOnWriteArrayList<>();
1606
+		private List<Integer> _shieldSkins = new CopyOnWriteArrayList<>();
1607
+		
1608
+		
1609
+			private static final String INSERT_OR_UPDATE_CHARACTER_DRESSME_DATA = "INSERT INTO characters_dressme_data (obj_Id, armor_skins, armor_skin_option, weapon_skins, weapon_skin_option, hair_skins, hair_skin_option, face_skins, face_skin_option) VALUES (?,?,?,?,?,?,?,?,?) "
1610
+			+ "ON DUPLICATE KEY UPDATE obj_Id=?, armor_skins=?, armor_skin_option=?, weapon_skins=?, weapon_skin_option=?, hair_skins=?, hair_skin_option=?, face_skins=?, face_skin_option=?, shield_skins=?, shield_skin_option=?";
1611
+		private static final String RESTORE_CHARACTER_DRESSME_DATA = "SELECT obj_Id, armor_skins, armor_skin_option, weapon_skins, weapon_skin_option, hair_skins, hair_skin_option, face_skins, face_skin_option, shield_skins, shield_skin_option FROM characters_dressme_data WHERE obj_id=?";
1612
+		
1613
+		
1614
+		
1615
+		
1616
+		
1617
+		
1618
+		
1619
+	
1620
+	
1621
+	
1622
+	
1623
 	private static final String RESTORE_SKILLS_FOR_CHAR = "SELECT skill_id,skill_level FROM character_skills WHERE char_obj_id=? AND class_index=?";
1624
 	private static final String ADD_OR_UPDATE_SKILL = "INSERT INTO character_skills (char_obj_id,skill_id,skill_level,class_index) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE skill_level=VALUES(skill_level)";
1625
 	private static final String DELETE_SKILL_FROM_CHAR = "DELETE FROM character_skills WHERE skill_id=? AND char_obj_id=? AND class_index=?";
1626
@@ -1225,6 +1264,28 @@
1627
 		if (item.getItem() instanceof Weapon)
1628
 			item.unChargeAllShots();
1629
 		
1630
+		
1631
+		
1632
+
1633
+		if (getWeaponSkinOption() > 0 && DressMeData.getInstance().getWeaponSkinsPackage(getWeaponSkinOption()) != null)
1634
+		{
1635
+			sendMessage("At first you must to remove a skin of weapon.");
1636
+			sendPacket(new ExShowScreenMessage("At first you must to remove a skin of weapon.", 2000));
1637
+			sendPacket(new PlaySound("ItemSound3.sys_impossible"));
1638
+			return;
1639
+		}
1640
+		
1641
+		if (getShieldSkinOption() > 0 && DressMeData.getInstance().getShieldSkinsPackage(getShieldSkinOption()) != null)
1642
+		{
1643
+			sendMessage("At first you must to remove a skin of weapon.");
1644
+			sendPacket(new ExShowScreenMessage("At first you must to remove a skin of weapon.", 2000));
1645
+			sendPacket(new PlaySound("ItemSound3.sys_impossible"));
1646
+			return;
1647
+		}
1648
+		
1649
+		
1650
+		
1651
+		
1652
 		if (isEquipped)
1653
 		{
1654
 			if (item.getEnchantLevel() > 0)
1655
@@ -4379,7 +4440,7 @@
1656
 					player.refreshHennaList();
1657
 					
1658
 					player.restoreFriendList();
1659
-					
1660
+					player.restoreDressMeData();					
1661
 					player.setOnlineStatus(true, false);
1662
 					player.setRunning(true);
1663
 					player.setStanding(true);
1664
@@ -4484,6 +4545,20 @@
1665
 	 */
1666
 	public synchronized void store(boolean storeActiveEffects)
1667
 	{
1668
+		
1669
+		
1670
+				
1671
+				
1672
+						if (!isTryingSkin() || !isTryingSkinPremium())
1673
+							{
1674
+								storeDressMeData();
1675
+							}
1676
+				
1677
+				
1678
+				
1679
+				
1680
+		
1681
+		
1682
 		storeCharBase();
1683
 		storeCharSub();
1684
 		storeEffect(storeActiveEffects);
1685
@@ -7444,4 +7519,473 @@
1686
 		
1687
 		return gms;
1688
 	}
1689
+	
1690
+	
1691
+	
1692
+	
1693
+	
1694
+	
1695
+	
1696
+
1697
+	private synchronized void storeDressMeData()
1698
+	{
1699
+		
1700
+		try (Connection con = ConnectionPool.getConnection();
1701
+			PreparedStatement statement = con.prepareStatement(INSERT_OR_UPDATE_CHARACTER_DRESSME_DATA))
1702
+		{
1703
+			
1704
+			statement.setInt(1, getObjectId());
1705
+			if (_armorSkins.isEmpty())
1706
+			{
1707
+				statement.setString(2, "");
1708
+			}
1709
+			else
1710
+			{
1711
+				String s = "";
1712
+				for (int i : _armorSkins)
1713
+				{
1714
+					s += String.valueOf(i) + ",";
1715
+				}
1716
+				statement.setString(2, s);
1717
+			}
1718
+			statement.setInt(3, getArmorSkinOption());
1719
+			
1720
+			if (_weaponSkins.isEmpty())
1721
+			{
1722
+				statement.setString(4, "");
1723
+			}
1724
+			else
1725
+			{
1726
+				String s = "";
1727
+				for (int i : _weaponSkins)
1728
+				{
1729
+					s += String.valueOf(i) + ",";
1730
+				}
1731
+				statement.setString(4, s);
1732
+			}
1733
+			statement.setInt(5, getWeaponSkinOption());
1734
+			
1735
+			if (_hairSkins.isEmpty())
1736
+			{
1737
+				statement.setString(6, "");
1738
+			}
1739
+			else
1740
+			{
1741
+				String s = "";
1742
+				for (int i : _hairSkins)
1743
+				{
1744
+					s += String.valueOf(i) + ",";
1745
+				}
1746
+				statement.setString(6, s);
1747
+			}
1748
+			statement.setInt(7, getHairSkinOption());
1749
+			
1750
+			if (_faceSkins.isEmpty())
1751
+			{
1752
+				statement.setString(8, "");
1753
+			}
1754
+			else
1755
+			{
1756
+				String s = "";
1757
+				for (int i : _faceSkins)
1758
+				{
1759
+					s += String.valueOf(i) + ",";
1760
+				}
1761
+				statement.setString(8, s);
1762
+			}
1763
+			statement.setInt(9, getFaceSkinOption());
1764
+			
1765
+			if (_shieldSkins.isEmpty())
1766
+			{
1767
+				statement.setString(10, "");
1768
+			}
1769
+			else
1770
+			{
1771
+				String s = "";
1772
+				for (int i : _shieldSkins)
1773
+				{
1774
+					s += String.valueOf(i) + ",";
1775
+				}
1776
+				statement.setString(10, s);
1777
+			}
1778
+			statement.setInt(11, getShieldSkinOption());
1779
+			
1780
+			// second part
1781
+			
1782
+			statement.setInt(10, getObjectId());
1783
+			if (_armorSkins.isEmpty())
1784
+			{
1785
+				statement.setString(11, "");
1786
+			}
1787
+			else
1788
+			{
1789
+				String s = "";
1790
+				for (int i : _armorSkins)
1791
+				{
1792
+					s += String.valueOf(i) + ",";
1793
+				}
1794
+				statement.setString(11, s);
1795
+			}
1796
+			statement.setInt(12, getArmorSkinOption());
1797
+			
1798
+			if (_weaponSkins.isEmpty())
1799
+			{
1800
+				statement.setString(13, "");
1801
+			}
1802
+			else
1803
+			{
1804
+				String s = "";
1805
+				for (int i : _weaponSkins)
1806
+				{
1807
+					s += String.valueOf(i) + ",";
1808
+				}
1809
+				statement.setString(13, s);
1810
+			}
1811
+			statement.setInt(14, getWeaponSkinOption());
1812
+			
1813
+			if (_hairSkins.isEmpty())
1814
+			{
1815
+				statement.setString(15, "");
1816
+			}
1817
+			else
1818
+			{
1819
+				String s = "";
1820
+				for (int i : _hairSkins)
1821
+				{
1822
+					s += String.valueOf(i) + ",";
1823
+				}
1824
+				statement.setString(15, s);
1825
+			}
1826
+			statement.setInt(16, getHairSkinOption());
1827
+			
1828
+			if (_faceSkins.isEmpty())
1829
+			{
1830
+				statement.setString(17, "");
1831
+			}
1832
+			else
1833
+			{
1834
+				String s = "";
1835
+				for (int i : _faceSkins)
1836
+				{
1837
+					s += String.valueOf(i) + ",";
1838
+				}
1839
+				statement.setString(17, s);
1840
+			}
1841
+			statement.setInt(18, getFaceSkinOption());
1842
+			
1843
+			if (_shieldSkins.isEmpty())
1844
+			{
1845
+				statement.setString(19, "");
1846
+			}
1847
+			else
1848
+			{
1849
+				String s = "";
1850
+				for (int i : _shieldSkins)
1851
+				{
1852
+					s += String.valueOf(i) + ",";
1853
+				}
1854
+				statement.setString(19, s);
1855
+			}
1856
+			statement.setInt(20, getShieldSkinOption());
1857
+			
1858
+			statement.execute();
1859
+			
1860
+		}
1861
+		catch (Exception e)
1862
+		{
1863
+			
1864
+			LOGGER.warn("Could not store storeDressMeData():");
1865
+			e.printStackTrace();
1866
+			
1867
+		}
1868
+		
1869
+	}
1870
+	
1871
+	private void restoreDressMeData()
1872
+	{
1873
+		try (Connection con = ConnectionPool.getConnection();
1874
+			PreparedStatement statement = con.prepareStatement(RESTORE_CHARACTER_DRESSME_DATA))
1875
+		{
1876
+			
1877
+			statement.setInt(1, getObjectId()); // Establecer el parΓ‘metro objectId
1878
+			
1879
+			try (ResultSet rset = statement.executeQuery())
1880
+			{
1881
+				while (rset.next())
1882
+				{
1883
+					String armorskinIds = rset.getString("armor_skins");
1884
+					if (armorskinIds != null && armorskinIds.length() > 0)
1885
+					{
1886
+						for (String s : armorskinIds.split(","))
1887
+						{
1888
+							if (s == null)
1889
+							{
1890
+								continue;
1891
+							}
1892
+							buyArmorSkin(Integer.parseInt(s));
1893
+						}
1894
+					}
1895
+					setArmorSkinOption(rset.getInt("armor_skin_option"));
1896
+					
1897
+					String weaponskinIds = rset.getString("weapon_skins");
1898
+					if (weaponskinIds != null && weaponskinIds.length() > 0)
1899
+					{
1900
+						for (String s : weaponskinIds.split(","))
1901
+						{
1902
+							if (s == null)
1903
+							{
1904
+								continue;
1905
+							}
1906
+							buyWeaponSkin(Integer.parseInt(s));
1907
+						}
1908
+					}
1909
+					setWeaponSkinOption(rset.getInt("weapon_skin_option"));
1910
+					
1911
+					String hairskinIds = rset.getString("hair_skins");
1912
+					if (hairskinIds != null && hairskinIds.length() > 0)
1913
+					{
1914
+						for (String s : hairskinIds.split(","))
1915
+						{
1916
+							if (s == null)
1917
+							{
1918
+								continue;
1919
+							}
1920
+							buyHairSkin(Integer.parseInt(s));
1921
+						}
1922
+					}
1923
+					setHairSkinOption(rset.getInt("hair_skin_option"));
1924
+					
1925
+					String faceskinIds = rset.getString("face_skins");
1926
+					if (faceskinIds != null && faceskinIds.length() > 0)
1927
+					{
1928
+						for (String s : faceskinIds.split(","))
1929
+						{
1930
+							if (s == null)
1931
+							{
1932
+								continue;
1933
+							}
1934
+							buyFaceSkin(Integer.parseInt(s));
1935
+						}
1936
+					}
1937
+					setFaceSkinOption(rset.getInt("face_skin_option"));
1938
+					
1939
+					String shieldkinIds = rset.getString("shield_skins");
1940
+					if (shieldkinIds != null && shieldkinIds.length() > 0)
1941
+					{
1942
+						for (String s : shieldkinIds.split(","))
1943
+						{
1944
+							if (s == null)
1945
+							{
1946
+								continue;
1947
+							}
1948
+							buyShieldSkin(Integer.parseInt(s));
1949
+						}
1950
+					}
1951
+					setShieldSkinOption(rset.getInt("shield_skin_option"));
1952
+				}
1953
+			}
1954
+		}
1955
+		catch (Exception e)
1956
+		{
1957
+			LOGGER.warn("Could not restore char data:");
1958
+			e.printStackTrace();
1959
+		}
1960
+	}
1961
+
1962
+
1963
+
1964
+
1965
+
1966
+
1967
+
1968
+
1969
+
1970
+
1971
+	
1972
+	// Dress Me
1973
+	public boolean isTryingSkin()
1974
+	{
1975
+		return isTryingSkin;
1976
+	}
1977
+	
1978
+	public void setIsTryingSkin(boolean b)
1979
+	{
1980
+		isTryingSkin = b;
1981
+	}
1982
+	
1983
+	public boolean isTryingSkinPremium()
1984
+	{
1985
+		return isTryingSkinPremium;
1986
+	}
1987
+	
1988
+	public void setIsTryingSkinPremium(boolean b)
1989
+	{
1990
+		isTryingSkinPremium = b;
1991
+	}
1992
+	
1993
+	public boolean hasArmorSkin(int skin)
1994
+	{
1995
+		return _armorSkins.contains(skin);
1996
+	}
1997
+	
1998
+	public boolean hasWeaponSkin(int skin)
1999
+	{
2000
+		return _weaponSkins.contains(skin);
2001
+	}
2002
+	
2003
+	public boolean hasHairSkin(int skin)
2004
+	{
2005
+		return _hairSkins.contains(skin);
2006
+	}
2007
+	
2008
+	public boolean hasFaceSkin(int skin)
2009
+	{
2010
+		return _faceSkins.contains(skin);
2011
+	}
2012
+	
2013
+	public boolean hasShieldSkin(int skin)
2014
+	{
2015
+		return _shieldSkins.contains(skin);
2016
+	}
2017
+	
2018
+	public boolean hasEquippedArmorSkin(String skin)
2019
+	{
2020
+		return String.valueOf(_armorSkinOption).contains(String.valueOf(skin));
2021
+	}
2022
+	
2023
+	public boolean hasEquippedWeaponSkin(String skin)
2024
+	{
2025
+		return String.valueOf(_weaponSkinOption).contains(String.valueOf(skin));
2026
+	}
2027
+	
2028
+	public boolean hasEquippedHairSkin(String skin)
2029
+	{
2030
+		return String.valueOf(_hairSkinOption).contains(String.valueOf(skin));
2031
+	}
2032
+	
2033
+	public boolean hasEquippedFaceSkin(String skin)
2034
+	{
2035
+		return String.valueOf(_faceSkinOption).contains(String.valueOf(skin));
2036
+	}
2037
+	
2038
+	public boolean hasEquippedShieldSkin(String skin)
2039
+	{
2040
+		return String.valueOf(_shieldSkinOption).contains(String.valueOf(skin));
2041
+	}
2042
+	
2043
+	public void buyArmorSkin(int id)
2044
+	{
2045
+		if (!_armorSkins.contains(id))
2046
+		{
2047
+			_armorSkins.add(id);
2048
+		}
2049
+	}
2050
+	
2051
+	public void buyWeaponSkin(int id)
2052
+	{
2053
+		if (!_weaponSkins.contains(id))
2054
+		{
2055
+			_weaponSkins.add(id);
2056
+		}
2057
+	}
2058
+	
2059
+	public void buyHairSkin(int id)
2060
+	{
2061
+		if (!_hairSkins.contains(id))
2062
+		{
2063
+			_hairSkins.add(id);
2064
+		}
2065
+	}
2066
+	
2067
+	public void buyFaceSkin(int id)
2068
+	{
2069
+		if (!_faceSkins.contains(id))
2070
+		{
2071
+			_faceSkins.add(id);
2072
+		}
2073
+	}
2074
+	
2075
+	public void buyShieldSkin(int id)
2076
+	{
2077
+		if (!_shieldSkins.contains(id))
2078
+		{
2079
+			_shieldSkins.add(id);
2080
+		}
2081
+	}
2082
+	
2083
+	public void setArmorSkinOption(int armorSkinOption)
2084
+	{
2085
+		_armorSkinOption = armorSkinOption;
2086
+	}
2087
+	
2088
+	public int getArmorSkinOption()
2089
+	{
2090
+		return _armorSkinOption;
2091
+	}
2092
+	
2093
+	public void setWeaponSkinOption(int weaponSkinOption)
2094
+	{
2095
+		_weaponSkinOption = weaponSkinOption;
2096
+	}
2097
+	
2098
+	public int getWeaponSkinOption()
2099
+	{
2100
+		return _weaponSkinOption;
2101
+	}
2102
+	
2103
+	public void setHairSkinOption(int hairSkinOption)
2104
+	{
2105
+		_hairSkinOption = hairSkinOption;
2106
+	}
2107
+	
2108
+	public int getHairSkinOption()
2109
+	{
2110
+		return _hairSkinOption;
2111
+	}
2112
+	
2113
+	public void setFaceSkinOption(int faceSkinOption)
2114
+	{
2115
+		_faceSkinOption = faceSkinOption;
2116
+	}
2117
+	
2118
+	public int getFaceSkinOption()
2119
+	{
2120
+		return _faceSkinOption;
2121
+	}
2122
+	
2123
+	public void setShieldSkinOption(int shieldSkinOption)
2124
+	{
2125
+		_shieldSkinOption = shieldSkinOption;
2126
+	}
2127
+	
2128
+	public int getShieldSkinOption()
2129
+	{
2130
+		return _shieldSkinOption;
2131
+	}	
2132
+	
2133
+	
2134
+	
2135
+	
2136
+	
2137
+	
2138
+	
2139
+	
2140
 }
2141
\ No newline at end of file
2142
diff --git java/net/sf/l2j/gameserver/model/item/kind/Item.java java/net/sf/l2j/gameserver/model/item/kind/Item.java
2143
index a461fe2..9c641b1 100644
2144
--- java/net/sf/l2j/gameserver/model/item/kind/Item.java
2145
+++ java/net/sf/l2j/gameserver/model/item/kind/Item.java
2146
@@ -1,5 +1,8 @@
2147
 package net.sf.l2j.gameserver.model.item.kind;
2148
 
2149
+import java.sql.Connection;
2150
+import java.sql.PreparedStatement;
2151
+import java.sql.ResultSet;
2152
 import java.util.ArrayList;
2153
 import java.util.Collections;
2154
 import java.util.HashMap;
2155
@@ -7,7 +10,9 @@
2156
 import java.util.Map;
2157
 
2158
 import net.sf.l2j.commons.data.StatSet;
2159
+import net.sf.l2j.commons.pool.ConnectionPool;
2160
 
2161
+import net.sf.l2j.gameserver.data.xml.ItemData;
2162
 import net.sf.l2j.gameserver.enums.items.ActionType;
2163
 import net.sf.l2j.gameserver.enums.items.ArmorType;
2164
 import net.sf.l2j.gameserver.enums.items.CrystalType;
2165
@@ -21,6 +26,7 @@
2166
 import net.sf.l2j.gameserver.model.actor.Summon;
2167
 import net.sf.l2j.gameserver.model.holder.IntIntHolder;
2168
 import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
2169
+import net.sf.l2j.gameserver.network.GameClient;
2170
 import net.sf.l2j.gameserver.network.SystemMessageId;
2171
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
2172
 import net.sf.l2j.gameserver.scripting.Quest;
2173
@@ -33,6 +39,10 @@
2174
  */
2175
 public abstract class Item
2176
 {
2177
+		
2178
+		private static Map<Integer, String> _Icons = null;
2179
+		private static GameClient _client;
2180
+	
2181
 	private static final Map<String, Integer> SLOTS = new HashMap<>();
2182
 	{
2183
 		SLOTS.put("chest", SLOT_CHEST);
2184
@@ -543,4 +553,90 @@
2185
 	{
2186
 		return _questEvents;
2187
 	}
2188
+	
2189
+	
2190
+
2191
+	public static String getItemIcon(int itemId)
2192
+	{
2193
+		if (_Icons != null && !_Icons.isEmpty())
2194
+		{
2195
+			return _Icons.get(itemId);
2196
+		}
2197
+		return null;
2198
+	}
2199
+	
2200
+	public static void LoadAllIcons()
2201
+	{
2202
+		loadIcons();
2203
+	}
2204
+	
2205
+	
2206
+	
2207
+	public static String getItemNameById(int itemId)
2208
+	{
2209
+	     Item item = ItemData.getInstance().getTemplate(itemId);
2210
+		
2211
+		String itemName = "NoName";
2212
+		
2213
+		if (itemId != 0)
2214
+		{
2215
+			itemName = item.getName();
2216
+		}
2217
+		
2218
+		return itemName;
2219
+	}
2220
+	
2221
+	
2222
+	
2223
+	
2224
+	
2225
+	/**
2226
+	 * @return The client owner of this char.
2227
+	 */
2228
+	public GameClient getClient()
2229
+	{
2230
+		return _client;
2231
+	}
2232
+	
2233
+	public void setClient(GameClient client)
2234
+	{
2235
+		_client = client;
2236
+	}
2237
+	
2238
+	
2239
+	@SuppressWarnings("resource")
2240
+	private static void loadIcons()
2241
+	{
2242
+		_Icons = new HashMap<>();
2243
+	
2244
+		Connection con = null;
2245
+		try
2246
+		{
2247
+			con = ConnectionPool.getConnection();
2248
+			PreparedStatement statement = con.prepareStatement("SELECT * FROM item_icons");
2249
+			ResultSet rset = statement.executeQuery();
2250
+			
2251
+			while (rset.next())
2252
+			{
2253
+				int itemId = rset.getInt("itemId");
2254
+				String itemIcon = rset.getString("itemIcon");
2255
+				_Icons.put(itemId, itemIcon);
2256
+			}
2257
+			
2258
+			rset.close();
2259
+			statement.close();
2260
+		}
2261
+		catch (Exception e)
2262
+		{
2263
+			
2264
+		}
2265
+		finally
2266
+		{
2267
+			
2268
+		}
2269
+	}
2270
+	
2271
+	
2272
+	
2273
+	
2274
 }
2275
\ No newline at end of file
2276
diff --git java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
2277
index 882ab73..dcabe3f 100644
2278
--- java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
2279
+++ java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
2280
@@ -1,26 +1,46 @@
2281
 package net.sf.l2j.gameserver.network.clientpackets;
2282
 
2283
+import java.sql.Date;
2284
+import java.text.SimpleDateFormat;
2285
+import java.util.List;
2286
 import java.util.StringTokenizer;
2287
 import java.util.logging.Logger;
2288
+import java.util.stream.Collectors;
2289
+import java.util.stream.Stream;
2290
+
2291
+import net.sf.l2j.commons.pool.ThreadPool;
2292
 
2293
 import net.sf.l2j.Config;
2294
 import net.sf.l2j.gameserver.communitybbs.CommunityBoard;
2295
+import net.sf.l2j.gameserver.data.cache.HtmCache;
2296
 import net.sf.l2j.gameserver.data.manager.HeroManager;
2297
 import net.sf.l2j.gameserver.data.xml.AdminData;
2298
+import net.sf.l2j.gameserver.data.xml.ItemData;
2299
 import net.sf.l2j.gameserver.enums.FloodProtector;
2300
+import net.sf.l2j.gameserver.enums.items.WeaponType;
2301
 import net.sf.l2j.gameserver.handler.AdminCommandHandler;
2302
+import net.sf.l2j.gameserver.handler.CustomBypassHandler;
2303
 import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
2304
+import net.sf.l2j.gameserver.handler.IVoicedCommandHandler;
2305
+import net.sf.l2j.gameserver.handler.VoicedCommandHandler;
2306
 import net.sf.l2j.gameserver.model.World;
2307
 import net.sf.l2j.gameserver.model.WorldObject;
2308
 import net.sf.l2j.gameserver.model.actor.Npc;
2309
 import net.sf.l2j.gameserver.model.actor.Player;
2310
 import net.sf.l2j.gameserver.model.actor.instance.OlympiadManagerNpc;
2311
+import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
2312
+import net.sf.l2j.gameserver.model.item.kind.Item;
2313
 import net.sf.l2j.gameserver.model.olympiad.OlympiadManager;
2314
 import net.sf.l2j.gameserver.network.SystemMessageId;
2315
 import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
2316
+import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage;
2317
 import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
2318
+import net.sf.l2j.gameserver.network.serverpackets.PlaySound;
2319
 import net.sf.l2j.gameserver.scripting.QuestState;
2320
 
2321
+import Base.Skin.DressMeData;
2322
+import Base.Skin.SkinPackage;
2323
+
2324
 public final class RequestBypassToServer extends L2GameClientPacket
2325
 {
2326
 	private static final Logger GMAUDIT_LOG = Logger.getLogger("gmaudit");
2327
@@ -72,6 +92,436 @@
2328
 			
2329
 			ach.useAdminCommand(_command, player);
2330
 		}
2331
+		
2332
+		
2333
+		
2334
+		
2335
+		
2336
+        else if (_command.startsWith("voiced_"))
2337
+        {
2338
+            String command = _command.split(" ")[0];
2339
+
2340
+            IVoicedCommandHandler ach = VoicedCommandHandler.getInstance().getHandler(_command.substring(7));
2341
+
2342
+            if (ach == null)
2343
+            {
2344
+                player.sendMessage("The command " + command.substring(7) + " does not exist!");
2345
+                LOGGER.warn("No handler registered for command '" + _command + "'");
2346
+                return;
2347
+            }
2348
+            ach.useVoicedCommand(_command.substring(7), player, null);
2349
+        }
2350
+
2351
+
2352
+
2353
+
2354
+else if (_command.startsWith("custom_"))
2355
+{
2356
+Player player2 = getClient().getPlayer();
2357
+CustomBypassHandler.getInstance().handleBypass(player2, _command);
2358
+}
2359
+
2360
+
2361
+else if (_command.startsWith("dressme"))
2362
+{
2363
+if (!Config.ALLOW_DRESS_ME_IN_OLY && player.isInOlympiadMode())
2364
+{
2365
+    player.sendMessage("DressMe can't be used on The Olympiad game.");
2366
+    return;
2367
+}
2368
+
2369
+StringTokenizer st = new StringTokenizer(_command, " ");
2370
+st.nextToken();
2371
+if (!st.hasMoreTokens())
2372
+{
2373
+    showDressMeMainPage(player);
2374
+    return;
2375
+}
2376
+int page = Integer.parseInt(st.nextToken());
2377
+
2378
+if (!st.hasMoreTokens())
2379
+{
2380
+    showDressMeMainPage(player);
2381
+    return;
2382
+}
2383
+String next = st.nextToken();
2384
+if (next.startsWith("skinlist"))
2385
+{
2386
+    String type = st.nextToken();
2387
+    showSkinList(player, type, page);
2388
+}
2389
+else if (next.startsWith("myskinlist"))
2390
+{
2391
+    
2392
+    showMySkinList(player, page);
2393
+}
2394
+if (next.equals("clean"))
2395
+{
2396
+    String type = st.nextToken();
2397
+    
2398
+    if (player.isTryingSkin())
2399
+    {
2400
+        player.sendMessage("You can't do this while trying a skin.");
2401
+        player.sendPacket(new ExShowScreenMessage("You can't do this while trying a skin.", 2000));
2402
+        player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2403
+        showDressMeMainPage(player);
2404
+        return;
2405
+    }
2406
+    
2407
+    switch (type.toLowerCase())
2408
+    {
2409
+        case "armor":
2410
+            player.setArmorSkinOption(0);
2411
+            break;
2412
+        case "weapon":
2413
+            player.setWeaponSkinOption(0);
2414
+            break;
2415
+        case "hair":
2416
+            player.setHairSkinOption(0);
2417
+            break;
2418
+        case "face":
2419
+            player.setFaceSkinOption(0);
2420
+            break;
2421
+        case "shield":
2422
+            player.setShieldSkinOption(0);
2423
+            break;
2424
+    }
2425
+    
2426
+    player.broadcastUserInfo();
2427
+    showMySkinList(player, page);
2428
+}
2429
+else if (next.startsWith("buyskin"))
2430
+{
2431
+    if (!st.hasMoreTokens())
2432
+    {
2433
+        showDressMeMainPage(player);
2434
+        return;
2435
+    }
2436
+    
2437
+    int skinId = Integer.parseInt(st.nextToken());
2438
+    String type = st.nextToken();
2439
+    int itemId = Integer.parseInt(st.nextToken());
2440
+    
2441
+    SkinPackage sp = null;
2442
+    
2443
+    switch (type.toLowerCase())
2444
+    {
2445
+        case "armor":
2446
+            sp = DressMeData.getInstance().getArmorSkinsPackage(skinId);
2447
+            break;
2448
+        case "weapon":
2449
+            sp = DressMeData.getInstance().getWeaponSkinsPackage(skinId);
2450
+            
2451
+            if (player.getActiveWeaponItem() == null)
2452
+            {
2453
+                player.sendMessage("You can't buy this skin without a weapon.");
2454
+                player.sendPacket(new ExShowScreenMessage("You can't buy this skin without a weapon.", 2000));
2455
+                player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2456
+                showSkinList(player, type, page);
2457
+                return;
2458
+            }
2459
+            
2460
+            ItemInstance skinWeapon = null;
2461
+            if (ItemData.getInstance().getTemplate(itemId) != null)
2462
+            {
2463
+                skinWeapon = ItemData.getInstance().createDummyItem(itemId);
2464
+                
2465
+                if (!checkWeapons(player, skinWeapon, WeaponType.BOW, WeaponType.BOW) //
2466
+                    || !checkWeapons(player, skinWeapon, WeaponType.SWORD, WeaponType.SWORD) //
2467
+                    || !checkWeapons(player, skinWeapon, WeaponType.BLUNT, WeaponType.BLUNT) //
2468
+                    || !checkWeapons(player, skinWeapon, WeaponType.DAGGER, WeaponType.DAGGER) //
2469
+                    || !checkWeapons(player, skinWeapon, WeaponType.POLE, WeaponType.POLE) //
2470
+                    || !checkWeapons(player, skinWeapon, WeaponType.DUAL, WeaponType.DUAL) //
2471
+                    || !checkWeapons(player, skinWeapon, WeaponType.DUALFIST, WeaponType.DUALFIST) //
2472
+                    || !checkWeapons(player, skinWeapon, WeaponType.BIGSWORD, WeaponType.BIGSWORD) //
2473
+                    || !checkWeapons(player, skinWeapon, WeaponType.FIST, WeaponType.FIST) //
2474
+                    || !checkWeapons(player, skinWeapon, WeaponType.BIGBLUNT, WeaponType.BIGBLUNT))
2475
+                {
2476
+                    player.sendMessage("This skin is not suitable for your weapon type.");
2477
+                    player.sendPacket(new ExShowScreenMessage("This skin is not suitable for your weapon type.", 2000));
2478
+                    player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2479
+                    showSkinList(player, type, page);
2480
+                    return;
2481
+                }
2482
+            }
2483
+            break;
2484
+        case "hair":
2485
+            sp = DressMeData.getInstance().getHairSkinsPackage(skinId);
2486
+            break;
2487
+        case "face":
2488
+            sp = DressMeData.getInstance().getFaceSkinsPackage(skinId);
2489
+            break;
2490
+        case "shield":
2491
+            sp = DressMeData.getInstance().getShieldSkinsPackage(skinId);
2492
+            if (player.getActiveWeaponItem() == null)
2493
+            {
2494
+                player.sendMessage("You can't buy this skin without a weapon.");
2495
+                player.sendPacket(new ExShowScreenMessage("You can't buy this skin without a weapon.", 2000));
2496
+                player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2497
+                showSkinList(player, type, page);
2498
+                return;
2499
+            }
2500
+            
2501
+            ItemInstance skinShield = null;
2502
+            if (ItemData.getInstance().getTemplate(itemId) != null)
2503
+            {
2504
+                skinShield = ItemData.getInstance().createDummyItem(itemId);
2505
+                
2506
+                if (!checkWeapons(player, skinShield, WeaponType.BOW, WeaponType.BOW) //
2507
+                    || !checkWeapons(player, skinShield, WeaponType.POLE, WeaponType.POLE) //
2508
+                    || !checkWeapons(player, skinShield, WeaponType.DUAL, WeaponType.DUAL) //
2509
+                    || !checkWeapons(player, skinShield, WeaponType.DUALFIST, WeaponType.DUALFIST) //
2510
+                    || !checkWeapons(player, skinShield, WeaponType.BIGSWORD, WeaponType.BIGSWORD) //
2511
+                    || !checkWeapons(player, skinShield, WeaponType.FIST, WeaponType.FIST) //
2512
+                    || !checkWeapons(player, skinShield, WeaponType.BIGBLUNT, WeaponType.BIGBLUNT))
2513
+                {
2514
+                    player.sendMessage("This skin is not suitable for your weapon type.");
2515
+                    player.sendPacket(new ExShowScreenMessage("This skin is not suitable for your weapon type.", 2000));
2516
+                    player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2517
+                    showSkinList(player, type, page);
2518
+                    return;
2519
+                }
2520
+            }
2521
+            break;
2522
+    }
2523
+    
2524
+    if (sp == null)
2525
+    {
2526
+        player.sendMessage("There is no such skin.");
2527
+        player.sendPacket(new ExShowScreenMessage("There is no such skin.", 2000));
2528
+        player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2529
+        showSkinList(player, type, page);
2530
+        return;
2531
+    }
2532
+    
2533
+    
2534
+    if (player.destroyItemByItemId("dressme", sp.getPriceId(), sp.getPriceCount(), player, true))
2535
+    {
2536
+        player.sendMessage("You have successfully purchased " + sp.getName() + " skin.");
2537
+        player.sendPacket(new ExShowScreenMessage("You have successfully purchased " + sp.getName() + " skin.", 2000));
2538
+        
2539
+        switch (type.toLowerCase())
2540
+        {
2541
+            case "armor":
2542
+                player.buyArmorSkin(skinId);
2543
+                player.setArmorSkinOption(skinId);
2544
+                break;
2545
+            case "weapon":
2546
+                player.buyWeaponSkin(skinId);
2547
+                player.setWeaponSkinOption(skinId);
2548
+                break;
2549
+            case "hair":
2550
+                player.buyHairSkin(skinId);
2551
+                player.setHairSkinOption(skinId);
2552
+                break;
2553
+            case "face":
2554
+                player.buyFaceSkin(skinId);
2555
+                player.setFaceSkinOption(skinId);
2556
+                break;
2557
+            case "shield":
2558
+                player.buyShieldSkin(skinId);
2559
+                player.setShieldSkinOption(skinId);
2560
+                break;
2561
+        }
2562
+        
2563
+        player.broadcastUserInfo();
2564
+    }
2565
+    showSkinList(player, type, page);
2566
+}
2567
+else if (next.startsWith("tryskin"))
2568
+{
2569
+    
2570
+    int skinId = Integer.parseInt(st.nextToken());
2571
+    
2572
+    String type = st.nextToken();
2573
+    
2574
+    if (player.isTryingSkin())
2575
+    {
2576
+        player.sendMessage("You are already trying a skin.");
2577
+        player.sendPacket(new ExShowScreenMessage("You are already trying a skin.", 2000));
2578
+        player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2579
+        showSkinList(player, type, page);
2580
+        return;
2581
+    }
2582
+    
2583
+    player.setIsTryingSkin(true);
2584
+    
2585
+    int oldArmorSkinId = player.getArmorSkinOption();
2586
+    int oldWeaponSkinId = player.getWeaponSkinOption();
2587
+    int oldHairSkinId = player.getHairSkinOption();
2588
+    int oldFaceSkinId = player.getFaceSkinOption();
2589
+    int oldShieldSkinId = player.getShieldSkinOption();
2590
+    
2591
+    switch (type.toLowerCase())
2592
+    {
2593
+        case "armor":
2594
+            player.setArmorSkinOption(skinId);
2595
+            break;
2596
+        case "weapon":
2597
+            player.setWeaponSkinOption(skinId);
2598
+            break;
2599
+        case "hair":
2600
+            player.setHairSkinOption(skinId);
2601
+            break;
2602
+        case "face":
2603
+            player.setFaceSkinOption(skinId);
2604
+            break;
2605
+        case "shield":
2606
+            
2607
+            player.setShieldSkinOption(skinId);
2608
+            
2609
+            break;
2610
+    }
2611
+    
2612
+    player.broadcastUserInfo();
2613
+    showSkinList(player, type, page);
2614
+    
2615
+    ThreadPool.schedule(() ->
2616
+    {
2617
+        switch (type.toLowerCase())
2618
+        {
2619
+            case "armor":
2620
+                player.setArmorSkinOption(oldArmorSkinId);
2621
+                break;
2622
+            case "weapon":
2623
+                player.setWeaponSkinOption(oldWeaponSkinId);
2624
+                break;
2625
+            case "hair":
2626
+                player.setHairSkinOption(oldHairSkinId);
2627
+                break;
2628
+            case "face":
2629
+                player.setFaceSkinOption(oldFaceSkinId);
2630
+                break;
2631
+            case "shield":
2632
+                player.setShieldSkinOption(oldShieldSkinId);
2633
+                break;
2634
+        }
2635
+        
2636
+        player.broadcastUserInfo();
2637
+        player.setIsTryingSkin(false);
2638
+    }, 5000);
2639
+}
2640
+else if (next.startsWith("setskin"))
2641
+{
2642
+    int id = Integer.parseInt(st.nextToken());
2643
+    String type = st.nextToken();
2644
+    int itemId = Integer.parseInt(st.nextToken());
2645
+    
2646
+    if (player.isTryingSkin())
2647
+    {
2648
+        player.sendMessage("You can't do this while trying skins.");
2649
+        player.sendPacket(new ExShowScreenMessage("You can't do this while trying skins.", 2000));
2650
+        player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2651
+        showMySkinList(player, page);
2652
+        return;
2653
+    }
2654
+    
2655
+    if (type.toLowerCase().contains("armor") && player.hasEquippedArmorSkin(String.valueOf(id)) || type.toLowerCase().contains("weapon") && player.hasEquippedWeaponSkin(String.valueOf(id))
2656
+        || type.toLowerCase().contains("hair") && player.hasEquippedHairSkin(String.valueOf(id)) || type.toLowerCase().contains("face") && player.hasEquippedFaceSkin(String.valueOf(id)))
2657
+    {
2658
+        player.sendMessage("You are already equipped this skin.");
2659
+        player.sendPacket(new ExShowScreenMessage("You are already equipped this skin.", 2000));
2660
+        player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2661
+        showMySkinList(player, page);
2662
+        return;
2663
+    }
2664
+    
2665
+    switch (type.toLowerCase())
2666
+    {
2667
+        case "armor":
2668
+            player.setArmorSkinOption(id);
2669
+            break;
2670
+        case "weapon":
2671
+            if (player.getActiveWeaponItem() == null)
2672
+            {
2673
+                player.sendMessage("You can't use this skin without a weapon.");
2674
+                player.sendPacket(new ExShowScreenMessage("You can't use this skin without a weapon.", 2000));
2675
+                player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2676
+                showMySkinList(player, page);
2677
+                return;
2678
+            }
2679
+            
2680
+            ItemInstance skinWeapon = null;
2681
+            if (ItemData.getInstance().getTemplate(itemId) != null)
2682
+            {
2683
+                skinWeapon = ItemData.getInstance().createDummyItem(itemId);
2684
+                
2685
+                if (!checkWeapons(player, skinWeapon, WeaponType.BOW, WeaponType.BOW) //
2686
+                    || !checkWeapons(player, skinWeapon, WeaponType.SWORD, WeaponType.SWORD) //
2687
+                    || !checkWeapons(player, skinWeapon, WeaponType.BLUNT, WeaponType.BLUNT) //
2688
+                    || !checkWeapons(player, skinWeapon, WeaponType.DAGGER, WeaponType.DAGGER) //
2689
+                    || !checkWeapons(player, skinWeapon, WeaponType.POLE, WeaponType.POLE) //
2690
+                    || !checkWeapons(player, skinWeapon, WeaponType.DUAL, WeaponType.DUAL) //
2691
+                    || !checkWeapons(player, skinWeapon, WeaponType.DUALFIST, WeaponType.DUALFIST) //
2692
+                    || !checkWeapons(player, skinWeapon, WeaponType.BIGSWORD, WeaponType.BIGSWORD) //
2693
+                    || !checkWeapons(player, skinWeapon, WeaponType.FIST, WeaponType.FIST) //
2694
+                    || !checkWeapons(player, skinWeapon, WeaponType.BIGBLUNT, WeaponType.BIGBLUNT))
2695
+                {
2696
+                    player.sendMessage("This skin is not suitable for your weapon type.");
2697
+                    player.sendPacket(new ExShowScreenMessage("This skin is not suitable for your weapon type.", 2000));
2698
+                    player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2699
+                    showMySkinList(player, page);
2700
+                    return;
2701
+                }
2702
+                
2703
+                player.setWeaponSkinOption(id);
2704
+            }
2705
+            break;
2706
+        case "hair":
2707
+            player.setHairSkinOption(id);
2708
+            break;
2709
+        case "face":
2710
+            player.setFaceSkinOption(id);
2711
+            break;
2712
+        case "shield":
2713
+            if (player.getActiveWeaponItem() == null)
2714
+            {
2715
+                player.sendMessage("You can't use this skin without a weapon.");
2716
+                player.sendPacket(new ExShowScreenMessage("You can't use this skin without a weapon.", 2000));
2717
+                player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2718
+                showMySkinList(player, page);
2719
+                return;
2720
+            }
2721
+            
2722
+            ItemInstance skinShield = null;
2723
+            if (ItemData.getInstance().getTemplate(itemId) != null)
2724
+            {
2725
+                skinShield = ItemData.getInstance().createDummyItem(itemId);
2726
+                
2727
+                if (!checkWeapons(player, skinShield, WeaponType.BOW, WeaponType.BOW) //
2728
+                    || !checkWeapons(player, skinShield, WeaponType.POLE, WeaponType.POLE) //
2729
+                    || !checkWeapons(player, skinShield, WeaponType.DUAL, WeaponType.DUAL) //
2730
+                    || !checkWeapons(player, skinShield, WeaponType.DUALFIST, WeaponType.DUALFIST) //
2731
+                    || !checkWeapons(player, skinShield, WeaponType.BIGSWORD, WeaponType.BIGSWORD) //
2732
+                    || !checkWeapons(player, skinShield, WeaponType.FIST, WeaponType.FIST) //
2733
+                    || !checkWeapons(player, skinShield, WeaponType.BIGBLUNT, WeaponType.BIGBLUNT))
2734
+                {
2735
+                    player.sendMessage("This skin is not suitable for your weapon type.");
2736
+                    player.sendPacket(new ExShowScreenMessage("This skin is not suitable for your weapon type.", 2000));
2737
+                    player.sendPacket(new PlaySound("ItemSound3.sys_impossible"));
2738
+                    showMySkinList(player, page);
2739
+                    return;
2740
+                }
2741
+                
2742
+                player.setShieldSkinOption(id);
2743
+            }
2744
+            
2745
+            break;
2746
+    }
2747
+    
2748
+    player.broadcastUserInfo();
2749
+    showMySkinList(player, page);
2750
+}
2751
+
2752
+
2753
+      }	
2754
+		
2755
+		
2756
+		
2757
+		
2758
+		
2759
+		
2760
+		
2761
 		else if (_command.startsWith("player_help "))
2762
 		{
2763
 			final String path = _command.substring(12);
2764
@@ -186,4 +636,263 @@
2765
 			player.enterOlympiadObserverMode(arenaId);
2766
 		}
2767
 	}
2768
+	
2769
+	   public static String getItemNameById(int itemId)
2770
+	   {
2771
+	       Item item = ItemData.getInstance().getTemplate(itemId);
2772
+	       
2773
+	       String itemName = "NoName";
2774
+	       
2775
+	       if (itemId != 0)
2776
+	       {
2777
+	           itemName = item.getName();
2778
+	       }
2779
+	       
2780
+	       return itemName;
2781
+	   }
2782
+	   
2783
+	   
2784
+	   public static void showDressMeMainPage(Player player)
2785
+	   {
2786
+	       NpcHtmlMessage htm = new NpcHtmlMessage(1);
2787
+	       String text = HtmCache.getInstance().getHtm("data/html/dressme/index.htm");
2788
+	       
2789
+	       htm.setHtml(text);
2790
+	       
2791
+	       {
2792
+	           htm.replace("%time%", sdf.format(new Date(System.currentTimeMillis())));
2793
+	           htm.replace("%dat%", (new SimpleDateFormat("dd/MM/yyyy")).format(new Date(System.currentTimeMillis())));
2794
+	           
2795
+	       }
2796
+	       
2797
+	       player.sendPacket(htm);
2798
+	   }
2799
+	   
2800
+	   static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
2801
+	   
2802
+	   private static void showSkinList(Player player, String type, int page)
2803
+	   {
2804
+	       NpcHtmlMessage html = new NpcHtmlMessage(1);
2805
+	       
2806
+	       html.setFile("data/html/dressme/allskins.htm");
2807
+	       
2808
+	       html.replace("%time%", sdf.format(new Date(System.currentTimeMillis())));
2809
+	       html.replace("%dat%", (new SimpleDateFormat("dd/MM/yyyy")).format(new Date(System.currentTimeMillis())));
2810
+	       
2811
+	       final int ITEMS_PER_PAGE = 8;
2812
+	       
2813
+	       int myPage = 1;
2814
+	       int i = 0;
2815
+	       int shown = 0;
2816
+	       boolean hasMore = false;
2817
+	       int itemId = 0;
2818
+	       
2819
+	       final StringBuilder sb = new StringBuilder();
2820
+	       
2821
+	       List<SkinPackage> tempList = null;
2822
+	       switch (type.toLowerCase())
2823
+	       {
2824
+	           case "armor":
2825
+	               tempList = DressMeData.getInstance().getArmorSkinOptions().values().stream().filter(s -> !player.hasArmorSkin(s.getId())).collect(Collectors.toList());
2826
+	               break;
2827
+	           case "weapon":
2828
+	               tempList = DressMeData.getInstance().getWeaponSkinOptions().values().stream().filter(s -> !player.hasWeaponSkin(s.getId())).collect(Collectors.toList());
2829
+	               break;
2830
+	           case "hair":
2831
+	               tempList = DressMeData.getInstance().getHairSkinOptions().values().stream().filter(s -> !player.hasHairSkin(s.getId())).collect(Collectors.toList());
2832
+	               break;
2833
+	           case "face":
2834
+	               tempList = DressMeData.getInstance().getFaceSkinOptions().values().stream().filter(s -> !player.hasFaceSkin(s.getId())).collect(Collectors.toList());
2835
+	               break;
2836
+	           case "shield":
2837
+	               tempList = DressMeData.getInstance().getShieldSkinOptions().values().stream().filter(s -> !player.hasShieldSkin(s.getId())).collect(Collectors.toList());
2838
+	               break;
2839
+	       }
2840
+	       
2841
+	       if (tempList != null && !tempList.isEmpty())
2842
+	       {
2843
+	           for (SkinPackage sp : tempList)
2844
+	           {
2845
+	               if (sp == null)
2846
+	               {
2847
+	                   continue;
2848
+	               }
2849
+	               
2850
+	               if (shown == ITEMS_PER_PAGE)
2851
+	               {
2852
+	                   hasMore = true;
2853
+	                   break;
2854
+	               }
2855
+	               
2856
+	               if (myPage != page)
2857
+	               {
2858
+	                   i++;
2859
+	                   if (i == ITEMS_PER_PAGE)
2860
+	                   {
2861
+	                       myPage++;
2862
+	                       i = 0;
2863
+	                   }
2864
+	                   continue;
2865
+	               }
2866
+	               
2867
+	               if (shown == ITEMS_PER_PAGE)
2868
+	               {
2869
+	                   hasMore = true;
2870
+	                   break;
2871
+	               }
2872
+	               
2873
+	               switch (type.toLowerCase())
2874
+	               {
2875
+	                   case "armor":
2876
+	                       itemId = sp.getChestId();
2877
+	                       break;
2878
+	                   case "weapon":
2879
+	                       itemId = sp.getWeaponId();
2880
+	                       break;
2881
+	                   case "hair":
2882
+	                       itemId = sp.getHairId();
2883
+	                       break;
2884
+	                   case "face":
2885
+	                       itemId = sp.getFaceId();
2886
+	                       break;
2887
+	                   case "shield":
2888
+	                       itemId = sp.getShieldId();
2889
+	                       break;
2890
+	               }
2891
+	               
2892
+	               sb.append("<table border=0 cellspacing=0 cellpadding=2 height=36><tr>");
2893
+	               sb.append("<td width=32 align=center>" + "<button width=32 height=32 back=" + Item.getItemIcon(itemId) + " fore=" + Item.getItemIcon(itemId) + ">" + "</td>");
2894
+	               sb.append("<td width=124>" + sp.getName() + "<br1> <font color=999999>Price:</font> <font color=339966>" + Item.getItemNameById(sp.getPriceId()) + "</font> (<font color=LEVEL>" + sp.getPriceCount() + "</font>)</td>");
2895
+	               sb.append("<td align=center width=65>" + "<button value=\"Buy\" action=\"bypass -h dressme " + page + " buyskin  " + sp.getId() + " " + type + " " + itemId + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" + "</td>");
2896
+	               sb.append("<td align=center width=65>" + "<button value=\"Try\" action=\"bypass -h dressme " + page + " tryskin  " + sp.getId() + " " + type + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" + "</td>");
2897
+	               
2898
+	               sb.append("</tr></table>");
2899
+	               sb.append("<img src=\"L2UI.Squaregray\" width=\"300\" height=\"1\">");
2900
+	               shown++;
2901
+	           }
2902
+	       }
2903
+	       
2904
+	       sb.append("<table width=300><tr>");
2905
+	       sb.append("<td align=center width=70>" + (page > 1 ? "<button value=\"< PREV\" action=\"bypass -h dressme " + (page - 1) + " skinlist " + type + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" : "") + "</td>");
2906
+	       sb.append("<td align=center width=140>Page: " + page + "</td>");
2907
+	       sb.append("<td align=center width=70>" + (hasMore ? "<button value=\"NEXT >\" action=\"bypass -h dressme " + (page + 1) + " skinlist " + type + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" : "") + "</td>");
2908
+	       sb.append("</tr></table>");
2909
+	       
2910
+	       html.replace("%showList%", sb.toString());
2911
+	       player.sendPacket(html);
2912
+	   }
2913
+	   
2914
+	   private static void showMySkinList(Player player, int page)
2915
+	   {
2916
+	       NpcHtmlMessage html = new NpcHtmlMessage(1);
2917
+	       html.setFile("data/html/dressme/myskins.htm");
2918
+	       
2919
+	       html.replace("%time%", sdf.format(new Date(System.currentTimeMillis())));
2920
+	       html.replace("%dat%", (new SimpleDateFormat("dd/MM/yyyy")).format(new Date(System.currentTimeMillis())));
2921
+	       
2922
+	       final int ITEMS_PER_PAGE = 8;
2923
+	       int itemId = 0;
2924
+	       
2925
+	       int myPage = 1;
2926
+	       int i = 0;
2927
+	       int shown = 0;
2928
+	       boolean hasMore = false;
2929
+	       
2930
+	       final StringBuilder sb = new StringBuilder();
2931
+	       
2932
+	       List<SkinPackage> armors = DressMeData.getInstance().getArmorSkinOptions().values().stream().filter(s -> player.hasArmorSkin(s.getId())).collect(Collectors.toList());
2933
+	       List<SkinPackage> weapons = DressMeData.getInstance().getWeaponSkinOptions().values().stream().filter(s -> player.hasWeaponSkin(s.getId())).collect(Collectors.toList());
2934
+	       List<SkinPackage> hairs = DressMeData.getInstance().getHairSkinOptions().values().stream().filter(s -> player.hasHairSkin(s.getId())).collect(Collectors.toList());
2935
+	       List<SkinPackage> faces = DressMeData.getInstance().getFaceSkinOptions().values().stream().filter(s -> player.hasFaceSkin(s.getId())).collect(Collectors.toList());
2936
+	       List<SkinPackage> shield = DressMeData.getInstance().getShieldSkinOptions().values().stream().filter(s -> player.hasShieldSkin(s.getId())).collect(Collectors.toList());
2937
+	       
2938
+	       List<SkinPackage> list = Stream.concat(armors.stream(), weapons.stream()).collect(Collectors.toList());
2939
+	       shield.stream().collect(Collectors.toList());
2940
+	       List<SkinPackage> list2 = Stream.concat(hairs.stream(), shield.stream()).collect(Collectors.toList());
2941
+	       List<SkinPackage> list3 = faces.stream().collect(Collectors.toList());
2942
+	       
2943
+	       List<SkinPackage> allLists = Stream.concat(list.stream(),Stream.concat(list2.stream(), list3.stream())).collect(Collectors.toList());
2944
+	       
2945
+	       if (!allLists.isEmpty())
2946
+	       {
2947
+	           for (SkinPackage sp : allLists)
2948
+	           {
2949
+	               if (sp == null)
2950
+	               {
2951
+	                   continue;
2952
+	               }
2953
+	               
2954
+	               if (shown == ITEMS_PER_PAGE)
2955
+	               {
2956
+	                   hasMore = true;
2957
+	                   break;
2958
+	               }
2959
+	               
2960
+	               if (myPage != page)
2961
+	               {
2962
+	                   i++;
2963
+	                   if (i == ITEMS_PER_PAGE)
2964
+	                   {
2965
+	                       myPage++;
2966
+	                       i = 0;
2967
+	                   }
2968
+	                   continue;
2969
+	               }
2970
+	               
2971
+	               if (shown == ITEMS_PER_PAGE)
2972
+	               {
2973
+	                   hasMore = true;
2974
+	                   break;
2975
+	               }
2976
+	               
2977
+	               switch (sp.getType().toLowerCase())
2978
+	               {
2979
+	                   case "armor":
2980
+	                       itemId = sp.getChestId();
2981
+	                       break;
2982
+	                   case "weapon":
2983
+	                       itemId = sp.getWeaponId();
2984
+	                       break;
2985
+	                   case "hair":
2986
+	                       itemId = sp.getHairId();
2987
+	                       break;
2988
+	                   case "face":
2989
+	                       itemId = sp.getFaceId();
2990
+	                       break;
2991
+	                   case "shield":
2992
+	                       itemId = sp.getShieldId();
2993
+	                       break;
2994
+	               }
2995
+	               
2996
+	               sb.append("<table border=0 cellspacing=0 cellpadding=2 height=36><tr>");
2997
+	               sb.append("<td width=32 align=center>" + "<button width=32 height=32 back=" + Item.getItemIcon(itemId) + " fore=" + Item.getItemIcon(itemId) + ">" + "</td>");
2998
+	               sb.append("<td width=124>" + sp.getName() + "</td>");
2999
+	               sb.append("<td align=center width=65>" + "<button value=\"Equip\" action=\"bypass -h dressme " + page + " setskin " + sp.getId() + " " + sp.getType() + " " + itemId + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" + "</td>");
3000
+	               sb.append("<td align=center width=65>" + "<button value=\"Remove\" action=\"bypass -h dressme " + page + " clean " + sp.getType() + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" + "</td>");
3001
+	               sb.append("</tr></table>");
3002
+	               sb.append("<img src=\"L2UI.Squaregray\" width=\"300\" height=\"1\">");
3003
+	               shown++;
3004
+	           }
3005
+	       }
3006
+	       
3007
+	       sb.append("<table width=300><tr>");
3008
+	       sb.append("<td align=center width=70>" + (page > 1 ? "<button value=\"< PREV\" action=\"bypass -h dressme " + (page - 1) + " myskinlist\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" : "") + "</td>");
3009
+	       sb.append("<td align=center width=140>Page: " + page + "</td>");
3010
+	       sb.append("<td align=center width=70>" + (hasMore ? "<button value=\"NEXT >\" action=\"bypass -h dressme " + (page + 1) + " myskinlist\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" : "") + "</td>");
3011
+	       sb.append("</tr></table>");
3012
+	       
3013
+	       html.replace("%showList%", sb.toString());
3014
+	       player.sendPacket(html);
3015
+	   }
3016
+	   
3017
+	   public static boolean checkWeapons(Player player, ItemInstance skin, WeaponType weapon1, WeaponType weapon2)
3018
+	   {
3019
+	       if (player.getActiveWeaponItem().getItemType() == weapon1 && skin.getItem().getItemType() != weapon2)
3020
+	       {
3021
+	           return false;
3022
+	       }
3023
+	       
3024
+	       return true;
3025
+	   }	
3026
+	
3027
 }
3028
\ No newline at end of file
3029
diff --git java/net/sf/l2j/gameserver/network/serverpackets/CharSelectInfo.java java/net/sf/l2j/gameserver/network/serverpackets/CharSelectInfo.java
3030
index 473b3fc..9ea446b 100644
3031
--- java/net/sf/l2j/gameserver/network/serverpackets/CharSelectInfo.java
3032
+++ java/net/sf/l2j/gameserver/network/serverpackets/CharSelectInfo.java
3033
@@ -8,12 +8,16 @@
3034
 
3035
 import net.sf.l2j.commons.pool.ConnectionPool;
3036
 
3037
+import net.sf.l2j.Config;
3038
 import net.sf.l2j.gameserver.data.sql.ClanTable;
3039
 import net.sf.l2j.gameserver.enums.Paperdoll;
3040
 import net.sf.l2j.gameserver.model.CharSelectSlot;
3041
 import net.sf.l2j.gameserver.model.pledge.Clan;
3042
 import net.sf.l2j.gameserver.network.GameClient;
3043
 
3044
+import Base.Skin.DressMeData;
3045
+import Base.Skin.SkinPackage;
3046
+
3047
 public class CharSelectInfo extends L2GameServerPacket
3048
 {
3049
 	private static final String SELECT_INFOS = "SELECT obj_Id, char_name, level, maxHp, curHp, maxMp, curMp, face, hairStyle, hairColor, sex, heading, x, y, z, exp, sp, karma, pvpkills, pkkills, clanid, race, classid, deletetime, cancraft, title, accesslevel, online, lastAccess, base_class FROM characters WHERE account_name=?";
3050
@@ -111,16 +115,77 @@
3051
 			writeD(slot.getPaperdollObjectId(Paperdoll.RFINGER));
3052
 			writeD(slot.getPaperdollObjectId(Paperdoll.LFINGER));
3053
 			writeD(slot.getPaperdollObjectId(Paperdoll.HEAD));
3054
-			writeD(slot.getPaperdollObjectId(Paperdoll.RHAND));
3055
-			writeD(slot.getPaperdollObjectId(Paperdoll.LHAND));
3056
-			writeD(slot.getPaperdollObjectId(Paperdoll.GLOVES));
3057
-			writeD(slot.getPaperdollObjectId(Paperdoll.CHEST));
3058
-			writeD(slot.getPaperdollObjectId(Paperdoll.LEGS));
3059
-			writeD(slot.getPaperdollObjectId(Paperdoll.FEET));
3060
-			writeD(slot.getPaperdollObjectId(Paperdoll.CLOAK));
3061
-			writeD(slot.getPaperdollObjectId(Paperdoll.RHAND));
3062
-			writeD(slot.getPaperdollObjectId(Paperdoll.HAIR));
3063
-			writeD(slot.getPaperdollObjectId(Paperdoll.FACE));
3064
+			
3065
+			if (Config.ALLOW_DRESS_ME_SYSTEM)
3066
+			{
3067
+				if (slot.getWeaponSkinOption() > 0 && getWeaponOption(slot.getWeaponSkinOption()) != null)
3068
+				{
3069
+					writeD(getWeaponOption(slot.getWeaponSkinOption()).getWeaponId() != 0 ? getWeaponOption(slot.getWeaponSkinOption()).getWeaponId() : slot.getPaperdollObjectId(Paperdoll.RHAND));
3070
+				}
3071
+				else
3072
+				{
3073
+					writeD(slot.getPaperdollObjectId(Paperdoll.RHAND));
3074
+				}
3075
+				
3076
+				writeD(slot.getPaperdollObjectId(Paperdoll.LHAND));
3077
+				
3078
+				if (slot.getArmorSkinOption() > 0 && getArmorOption(slot.getArmorSkinOption()) != null)
3079
+				{
3080
+					writeD(getArmorOption(slot.getArmorSkinOption()).getGlovesId() != 0 ? getArmorOption(slot.getArmorSkinOption()).getGlovesId() : slot.getPaperdollObjectId(Paperdoll.GLOVES));
3081
+					writeD(getArmorOption(slot.getArmorSkinOption()).getChestId() != 0 ? getArmorOption(slot.getArmorSkinOption()).getChestId() : slot.getPaperdollObjectId(Paperdoll.CHEST));
3082
+					writeD(getArmorOption(slot.getArmorSkinOption()).getLegsId() != 0 ? getArmorOption(slot.getArmorSkinOption()).getLegsId() : slot.getPaperdollObjectId(Paperdoll.LEGS));
3083
+					writeD(getArmorOption(slot.getArmorSkinOption()).getFeetId() != 0 ? getArmorOption(slot.getArmorSkinOption()).getFeetId() : slot.getPaperdollObjectId(Paperdoll.FEET));
3084
+				}
3085
+				else
3086
+				{
3087
+					writeD(slot.getPaperdollObjectId(Paperdoll.GLOVES));
3088
+					writeD(slot.getPaperdollObjectId(Paperdoll.CHEST));
3089
+					writeD(slot.getPaperdollObjectId(Paperdoll.LEGS));
3090
+					writeD(slot.getPaperdollObjectId(Paperdoll.FEET));
3091
+				}
3092
+				
3093
+				writeD(slot.getPaperdollObjectId(Paperdoll.CLOAK));
3094
+				
3095
+				if (slot.getWeaponSkinOption() > 0 && getWeaponOption(slot.getWeaponSkinOption()) != null)
3096
+				{
3097
+					writeD(getWeaponOption(slot.getWeaponSkinOption()).getWeaponId() != 0 ? getWeaponOption(slot.getWeaponSkinOption()).getWeaponId() : slot.getPaperdollObjectId(Paperdoll.RHAND));
3098
+				}
3099
+				else
3100
+				{
3101
+					writeD(slot.getPaperdollObjectId(Paperdoll.RHAND));
3102
+				}
3103
+				
3104
+				if (slot.getHairSkinOption() > 0 && getHairOption(slot.getHairSkinOption()) != null)
3105
+				{
3106
+					writeD(getHairOption(slot.getHairSkinOption()).getHairId() != 0 ? getHairOption(slot.getHairSkinOption()).getHairId() : slot.getPaperdollObjectId(Paperdoll.HAIR));
3107
+				}
3108
+				else
3109
+				{
3110
+					writeD(slot.getPaperdollObjectId(Paperdoll.HAIR));
3111
+				}
3112
+				
3113
+				if (slot.getFaceSkinOption() > 0 && getFaceOption(slot.getFaceSkinOption()) != null)
3114
+				{
3115
+					writeD(getFaceOption(slot.getFaceSkinOption()).getFaceId() != 0 ? getFaceOption(slot.getFaceSkinOption()).getFaceId() : slot.getPaperdollObjectId(Paperdoll.FACE));
3116
+				}
3117
+				else
3118
+				{
3119
+					writeD(slot.getPaperdollObjectId(Paperdoll.FACE));
3120
+				}
3121
+			}
3122
+			else
3123
+			{
3124
+				writeD(slot.getPaperdollObjectId(Paperdoll.RHAND));
3125
+				writeD(slot.getPaperdollObjectId(Paperdoll.LHAND));
3126
+				writeD(slot.getPaperdollObjectId(Paperdoll.GLOVES));
3127
+				writeD(slot.getPaperdollObjectId(Paperdoll.CHEST));
3128
+				writeD(slot.getPaperdollObjectId(Paperdoll.LEGS));
3129
+				writeD(slot.getPaperdollObjectId(Paperdoll.FEET));
3130
+				writeD(slot.getPaperdollObjectId(Paperdoll.CLOAK));
3131
+				writeD(slot.getPaperdollObjectId(Paperdoll.RHAND));
3132
+				writeD(slot.getPaperdollObjectId(Paperdoll.HAIR));
3133
+				writeD(slot.getPaperdollObjectId(Paperdoll.FACE));
3134
+			}
3135
 			
3136
 			writeD(slot.getPaperdollItemId(Paperdoll.HAIRALL));
3137
 			writeD(slot.getPaperdollItemId(Paperdoll.REAR));
3138
@@ -129,16 +194,76 @@
3139
 			writeD(slot.getPaperdollItemId(Paperdoll.RFINGER));
3140
 			writeD(slot.getPaperdollItemId(Paperdoll.LFINGER));
3141
 			writeD(slot.getPaperdollItemId(Paperdoll.HEAD));
3142
-			writeD(slot.getPaperdollItemId(Paperdoll.RHAND));
3143
-			writeD(slot.getPaperdollItemId(Paperdoll.LHAND));
3144
-			writeD(slot.getPaperdollItemId(Paperdoll.GLOVES));
3145
-			writeD(slot.getPaperdollItemId(Paperdoll.CHEST));
3146
-			writeD(slot.getPaperdollItemId(Paperdoll.LEGS));
3147
-			writeD(slot.getPaperdollItemId(Paperdoll.FEET));
3148
-			writeD(slot.getPaperdollItemId(Paperdoll.CLOAK));
3149
-			writeD(slot.getPaperdollItemId(Paperdoll.RHAND));
3150
-			writeD(slot.getPaperdollItemId(Paperdoll.HAIR));
3151
-			writeD(slot.getPaperdollItemId(Paperdoll.FACE));
3152
+			if (Config.ALLOW_DRESS_ME_SYSTEM)
3153
+			{
3154
+				if (slot.getWeaponSkinOption() > 0 && getWeaponOption(slot.getWeaponSkinOption()) != null)
3155
+				{
3156
+					writeD(getWeaponOption(slot.getWeaponSkinOption()).getWeaponId() != 0 ? getWeaponOption(slot.getWeaponSkinOption()).getWeaponId() : slot.getPaperdollItemId(Paperdoll.RHAND));
3157
+				}
3158
+				else
3159
+				{
3160
+					writeD(slot.getPaperdollItemId(Paperdoll.RHAND));
3161
+				}
3162
+				
3163
+				writeD(slot.getPaperdollItemId(Paperdoll.LHAND));
3164
+				
3165
+				if (slot.getArmorSkinOption() > 0 && getArmorOption(slot.getArmorSkinOption()) != null)
3166
+				{
3167
+					writeD(getArmorOption(slot.getArmorSkinOption()).getGlovesId() != 0 ? getArmorOption(slot.getArmorSkinOption()).getGlovesId() : slot.getPaperdollItemId(Paperdoll.GLOVES));
3168
+					writeD(getArmorOption(slot.getArmorSkinOption()).getChestId() != 0 ? getArmorOption(slot.getArmorSkinOption()).getChestId() : slot.getPaperdollItemId(Paperdoll.CHEST));
3169
+					writeD(getArmorOption(slot.getArmorSkinOption()).getLegsId() != 0 ? getArmorOption(slot.getArmorSkinOption()).getLegsId() : slot.getPaperdollItemId(Paperdoll.LEGS));
3170
+					writeD(getArmorOption(slot.getArmorSkinOption()).getFeetId() != 0 ? getArmorOption(slot.getArmorSkinOption()).getFeetId() : slot.getPaperdollItemId(Paperdoll.FEET));
3171
+				}
3172
+				else
3173
+				{
3174
+					writeD(slot.getPaperdollItemId(Paperdoll.GLOVES));
3175
+					writeD(slot.getPaperdollItemId(Paperdoll.CHEST));
3176
+					writeD(slot.getPaperdollItemId(Paperdoll.LEGS));
3177
+					writeD(slot.getPaperdollItemId(Paperdoll.FEET));
3178
+				}
3179
+				
3180
+				writeD(slot.getPaperdollItemId(Paperdoll.CLOAK));
3181
+				
3182
+				if (slot.getWeaponSkinOption() > 0 && getWeaponOption(slot.getWeaponSkinOption()) != null)
3183
+				{
3184
+					writeD(getWeaponOption(slot.getWeaponSkinOption()).getWeaponId() != 0 ? getWeaponOption(slot.getWeaponSkinOption()).getWeaponId() : slot.getPaperdollItemId(Paperdoll.RHAND));
3185
+				}
3186
+				else
3187
+				{
3188
+					writeD(slot.getPaperdollItemId(Paperdoll.RHAND));
3189
+				}
3190
+				
3191
+				if (slot.getHairSkinOption() > 0 && getHairOption(slot.getHairSkinOption()) != null)
3192
+				{
3193
+					writeD(getHairOption(slot.getHairSkinOption()).getHairId() != 0 ? getHairOption(slot.getHairSkinOption()).getHairId() : slot.getPaperdollItemId(Paperdoll.HAIR));
3194
+				}
3195
+				else
3196
+				{
3197
+					writeD(slot.getPaperdollItemId(Paperdoll.HAIR));
3198
+				}
3199
+				
3200
+				if (slot.getFaceSkinOption() > 0 && getFaceOption(slot.getFaceSkinOption()) != null)
3201
+				{
3202
+					writeD(getFaceOption(slot.getFaceSkinOption()).getFaceId() != 0 ? getFaceOption(slot.getFaceSkinOption()).getFaceId() : slot.getPaperdollItemId(Paperdoll.FACE));
3203
+				}
3204
+				else
3205
+				{
3206
+					writeD(slot.getPaperdollItemId(Paperdoll.FACE));
3207
+				}
3208
+			}
3209
+			else
3210
+			{
3211
+				writeD(slot.getPaperdollItemId(Paperdoll.RHAND));
3212
+				writeD(slot.getPaperdollItemId(Paperdoll.LHAND));
3213
+				writeD(slot.getPaperdollItemId(Paperdoll.GLOVES));
3214
+				writeD(slot.getPaperdollItemId(Paperdoll.CHEST));
3215
+				writeD(slot.getPaperdollItemId(Paperdoll.LEGS));
3216
+				writeD(slot.getPaperdollItemId(Paperdoll.FEET));
3217
+				writeD(slot.getPaperdollItemId(Paperdoll.CLOAK));
3218
+				writeD(slot.getPaperdollItemId(Paperdoll.RHAND));
3219
+				writeD(slot.getPaperdollItemId(Paperdoll.HAIR));
3220
+				writeD(slot.getPaperdollItemId(Paperdoll.FACE));
3221
+			}
3222
 			
3223
 			writeD(slot.getHairStyle());
3224
 			writeD(slot.getHairColor());
3225
@@ -235,6 +360,7 @@
3226
 					}
3227
 					
3228
 					slot.setClassId(activeClassId);
3229
+					loadCharacterDressMeInfo(slot, objectId);
3230
 					
3231
 					// Get the augmentation for equipped weapon.
3232
 					final int weaponObjId = slot.getPaperdollObjectId(Paperdoll.RHAND);
3233
@@ -273,4 +399,49 @@
3234
 		
3235
 		return new CharSelectSlot[0];
3236
 	}
3237
+	
3238
+	private static void loadCharacterDressMeInfo(final CharSelectSlot charInfopackage, final int objectId)
3239
+	{
3240
+		try (Connection con = ConnectionPool.getConnection();
3241
+			PreparedStatement statement = con.prepareStatement("SELECT obj_Id, armor_skins, armor_skin_option, weapon_skins, weapon_skin_option, hair_skins, hair_skin_option, face_skins, face_skin_option FROM characters_dressme_data WHERE obj_id=?"))
3242
+		{
3243
+			
3244
+			statement.setInt(1, objectId);
3245
+			try (ResultSet chardata = statement.executeQuery())
3246
+			{
3247
+				if (chardata.next())
3248
+				{
3249
+					charInfopackage.setArmorSkinOption(chardata.getInt("armor_skin_option"));
3250
+					charInfopackage.setWeaponSkinOption(chardata.getInt("weapon_skin_option"));
3251
+					charInfopackage.setHairSkinOption(chardata.getInt("hair_skin_option"));
3252
+					charInfopackage.setFaceSkinOption(chardata.getInt("face_skin_option"));
3253
+				}
3254
+			}
3255
+		}
3256
+		catch (final Exception e)
3257
+		{
3258
+			e.printStackTrace();
3259
+		}
3260
+	}
3261
+	
3262
+	public SkinPackage getArmorOption(int option)
3263
+	{
3264
+		return (DressMeData.getInstance().getArmorSkinsPackage(option));
3265
+	}
3266
+	
3267
+	public SkinPackage getWeaponOption(int option)
3268
+	{
3269
+		return DressMeData.getInstance().getWeaponSkinsPackage(option);
3270
+	}
3271
+	
3272
+	public SkinPackage getHairOption(int option)
3273
+	{
3274
+		return DressMeData.getInstance().getHairSkinsPackage(option);
3275
+	}
3276
+	
3277
+	public SkinPackage getFaceOption(int option)
3278
+	{
3279
+		return DressMeData.getInstance().getFaceSkinsPackage(option);
3280
+	}
3281
+	
3282
 }
3283
\ No newline at end of file
3284
diff --git java/net/sf/l2j/gameserver/model/CharSelectSlot.java java/net/sf/l2j/gameserver/model/CharSelectSlot.java
3285
index 814d28a..4ef5400 100644
3286
--- java/net/sf/l2j/gameserver/model/CharSelectSlot.java
3287
+++ java/net/sf/l2j/gameserver/model/CharSelectSlot.java
3288
@@ -49,6 +49,11 @@
3289
 	private int _z = 0;
3290
 	private int _accessLevel = 0;
3291
 	
3292
+	private int _armorSkinOption = 0;
3293
+	private int _weaponSkinOption = 0;
3294
+	private int _hairSkinOption = 0;
3295
+	private int _faceSkinOption = 0;
3296
+	
3297
 	public CharSelectSlot(int objectId, String name)
3298
 	{
3299
 		_objectId = objectId;
3300
@@ -368,4 +373,45 @@
3301
 		}
3302
 		return paperdoll;
3303
 	}
3304
+	
3305
+	public void setArmorSkinOption(int armorSkinOption)
3306
+	{
3307
+		_armorSkinOption = armorSkinOption;
3308
+	}
3309
+	
3310
+	public int getArmorSkinOption()
3311
+	{
3312
+		return _armorSkinOption;
3313
+	}
3314
+	
3315
+	public void setWeaponSkinOption(int armorSkinOption)
3316
+	{
3317
+		_weaponSkinOption = armorSkinOption;
3318
+	}
3319
+	
3320
+	public int getWeaponSkinOption()
3321
+	{
3322
+		return _weaponSkinOption;
3323
+	}
3324
+	
3325
+	public void setHairSkinOption(int hairSkinOption)
3326
+	{
3327
+		_hairSkinOption = hairSkinOption;
3328
+	}
3329
+	
3330
+	public int getHairSkinOption()
3331
+	{
3332
+		return _hairSkinOption;
3333
+	}
3334
+	
3335
+	public void setFaceSkinOption(int faceSkinOption)
3336
+	{
3337
+		_faceSkinOption = faceSkinOption;
3338
+	}
3339
+	
3340
+	public int getFaceSkinOption()
3341
+	{
3342
+		return _faceSkinOption;
3343
+	}
3344
+	
3345
 }
3346
\ No newline at end of file
3347
diff --git java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java
3348
index b963bd0..e5601b6 100644
3349
--- java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java
3350
+++ java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java
3351
@@ -9,6 +9,9 @@
3352
 import net.sf.l2j.gameserver.model.actor.Summon;
3353
 import net.sf.l2j.gameserver.model.actor.instance.Cubic;
3354
 
3355
+import Base.Skin.DressMeData;
3356
+import Base.Skin.SkinPackage;
3357
+
3358
 public class CharInfo extends L2GameServerPacket
3359
 {
3360
 	private final Player _player;
3361
@@ -43,16 +46,83 @@
3362
 		
3363
 		writeD(_player.getInventory().getItemIdFrom(Paperdoll.HAIRALL));
3364
 		writeD(_player.getInventory().getItemIdFrom(Paperdoll.HEAD));
3365
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3366
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.LHAND));
3367
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.GLOVES));
3368
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.CHEST));
3369
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.LEGS));
3370
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.FEET));
3371
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.CLOAK));
3372
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3373
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.HAIR));
3374
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.FACE));
3375
+	       if (Config.ALLOW_DRESS_ME_SYSTEM)
3376
+	       {
3377
+	           if (_player.getWeaponSkinOption() > 0 && getWeaponOption(_player.getWeaponSkinOption()) != null)
3378
+	           {
3379
+	               writeD(getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() != 0 ? getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() : _player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3380
+	           }
3381
+	           else
3382
+	           {
3383
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3384
+	           }
3385
+	           
3386
+	           if (_player.getShieldSkinOption() > 0 && getShieldOption(_player.getShieldSkinOption()) != null)
3387
+	           {
3388
+	               writeD(getShieldOption(_player.getShieldSkinOption()).getShieldId() != 0 ? getShieldOption(_player.getShieldSkinOption()).getShieldId() : _player.getInventory().getItemIdFrom(Paperdoll.LHAND));
3389
+	           }
3390
+	           else
3391
+	           {
3392
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.LHAND));
3393
+	           }
3394
+	           
3395
+	           if (_player.getArmorSkinOption() > 0 && getArmorOption(_player.getArmorSkinOption()) != null)
3396
+	           {
3397
+	               writeD(getArmorOption(_player.getArmorSkinOption()).getGlovesId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getGlovesId() : _player.getInventory().getItemIdFrom(Paperdoll.GLOVES));
3398
+	               writeD(getArmorOption(_player.getArmorSkinOption()).getChestId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getChestId() : _player.getInventory().getItemIdFrom(Paperdoll.CHEST));
3399
+	               writeD(getArmorOption(_player.getArmorSkinOption()).getLegsId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getLegsId() : _player.getInventory().getItemIdFrom(Paperdoll.LEGS));
3400
+	               writeD(getArmorOption(_player.getArmorSkinOption()).getFeetId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getFeetId() : _player.getInventory().getItemIdFrom(Paperdoll.FEET));
3401
+	           }
3402
+	           else
3403
+	           {
3404
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.GLOVES));
3405
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.CHEST));
3406
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.LEGS));
3407
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.FEET));
3408
+	           }
3409
+	           
3410
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.CLOAK));
3411
+	           
3412
+	           if (_player.getWeaponSkinOption() > 0 && getWeaponOption(_player.getWeaponSkinOption()) != null)
3413
+	           {
3414
+	               writeD(getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() != 0 ? getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() : _player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3415
+	           }
3416
+	           else
3417
+	           {
3418
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3419
+	           }
3420
+	           
3421
+	           if (_player.getHairSkinOption() > 0 && getHairOption(_player.getHairSkinOption()) != null)
3422
+	           {
3423
+	               writeD(getHairOption(_player.getHairSkinOption()).getHairId() != 0 ? getHairOption(_player.getHairSkinOption()).getHairId() : _player.getInventory().getItemIdFrom(Paperdoll.HAIR));
3424
+	           }
3425
+	           else
3426
+	           {
3427
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.HAIR));
3428
+	           }
3429
+	           
3430
+	           if (_player.getFaceSkinOption() > 0 && getFaceOption(_player.getFaceSkinOption()) != null)
3431
+	           {
3432
+	               writeD(getFaceOption(_player.getFaceSkinOption()).getFaceId() != 0 ? getFaceOption(_player.getFaceSkinOption()).getFaceId() : _player.getInventory().getItemIdFrom(Paperdoll.FACE));
3433
+	           }
3434
+	           else
3435
+	           {
3436
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.FACE));
3437
+	           }
3438
+	           
3439
+	       }
3440
+	       else {
3441
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3442
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.LHAND));
3443
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.GLOVES));
3444
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.CHEST));
3445
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.LEGS));
3446
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.FEET));
3447
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.CLOAK));
3448
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3449
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.HAIR));
3450
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.FACE));
3451
+	       }
3452
 		
3453
 		writeH(0x00);
3454
 		writeH(0x00);
3455
@@ -159,4 +229,30 @@
3456
 		writeD(_player.getAppearance().getTitleColor());
3457
 		writeD(CursedWeaponManager.getInstance().getCurrentStage(_player.getCursedWeaponEquippedId()));
3458
 	}
3459
+	
3460
+	   public SkinPackage getArmorOption(int option)
3461
+	   {
3462
+	      return (DressMeData.getInstance().getArmorSkinsPackage(option));
3463
+	   }
3464
+
3465
+	   public SkinPackage getWeaponOption(int option)
3466
+	   {
3467
+	      return DressMeData.getInstance().getWeaponSkinsPackage(option);
3468
+	   }
3469
+
3470
+	   public SkinPackage getHairOption(int option)
3471
+	   {
3472
+	      return DressMeData.getInstance().getHairSkinsPackage(option);
3473
+	   }
3474
+
3475
+	   public SkinPackage getFaceOption(int option)
3476
+	   {
3477
+	      return DressMeData.getInstance().getFaceSkinsPackage(option);
3478
+	   }
3479
+
3480
+	   public SkinPackage getShieldOption(int option)
3481
+	   {
3482
+	      return DressMeData.getInstance().getShieldSkinsPackage(option);
3483
+	   }	
3484
+	
3485
 }
3486
\ No newline at end of file
3487
diff --git java/net/sf/l2j/gameserver/network/serverpackets/UserInfo.java java/net/sf/l2j/gameserver/network/serverpackets/UserInfo.java
3488
index b1679c0..b89ba55 100644
3489
--- java/net/sf/l2j/gameserver/network/serverpackets/UserInfo.java
3490
+++ java/net/sf/l2j/gameserver/network/serverpackets/UserInfo.java
3491
@@ -9,6 +9,9 @@
3492
 import net.sf.l2j.gameserver.model.actor.Summon;
3493
 import net.sf.l2j.gameserver.model.actor.instance.Cubic;
3494
 
3495
+import Base.Skin.DressMeData;
3496
+import Base.Skin.SkinPackage;
3497
+
3498
 public class UserInfo extends L2GameServerPacket
3499
 {
3500
 	private final Player _player;
3501
@@ -63,16 +66,83 @@
3502
 		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.RFINGER));
3503
 		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.LFINGER));
3504
 		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.HEAD));
3505
-		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.RHAND));
3506
-		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.LHAND));
3507
-		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.GLOVES));
3508
-		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.CHEST));
3509
-		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.LEGS));
3510
-		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.FEET));
3511
-		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.CLOAK));
3512
-		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.RHAND));
3513
-		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.HAIR));
3514
-		writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.FACE));
3515
+	      if (Config.ALLOW_DRESS_ME_SYSTEM)
3516
+	      {
3517
+	          if (_player.getWeaponSkinOption() > 0 && getWeaponOption(_player.getWeaponSkinOption()) != null)
3518
+	          {
3519
+	              writeD(getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() != 0 ? getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() : _player.getInventory().getItemObjectIdFrom(Paperdoll.RHAND));
3520
+	          }
3521
+	          else
3522
+	          {
3523
+	              writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.RHAND));
3524
+	          }
3525
+	          
3526
+	          if (_player.getShieldSkinOption() > 0 && getShieldOption(_player.getShieldSkinOption()) != null)
3527
+	          {
3528
+	              writeD(getShieldOption(_player.getShieldSkinOption()).getShieldId() != 0 ? getShieldOption(_player.getShieldSkinOption()).getShieldId() : _player.getInventory().getItemObjectIdFrom(Paperdoll.LHAND));
3529
+	          }
3530
+	          else
3531
+	          {
3532
+	              writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.LHAND));
3533
+	          }
3534
+	          
3535
+	          if (_player.getArmorSkinOption() > 0 && getArmorOption(_player.getArmorSkinOption()) != null)
3536
+	          {
3537
+	              writeD(getArmorOption(_player.getArmorSkinOption()).getGlovesId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getGlovesId() : _player.getInventory().getItemObjectIdFrom(Paperdoll.GLOVES));
3538
+	              writeD(getArmorOption(_player.getArmorSkinOption()).getChestId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getChestId() : _player.getInventory().getItemObjectIdFrom(Paperdoll.CHEST));
3539
+	              writeD(getArmorOption(_player.getArmorSkinOption()).getLegsId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getLegsId() : _player.getInventory().getItemObjectIdFrom(Paperdoll.LEGS));
3540
+	              writeD(getArmorOption(_player.getArmorSkinOption()).getFeetId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getFeetId() : _player.getInventory().getItemObjectIdFrom(Paperdoll.FEET));
3541
+	          }
3542
+	          else
3543
+	          {
3544
+	              writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.GLOVES));
3545
+	              writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.CHEST));
3546
+	              writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.LEGS));
3547
+	              writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.FEET));
3548
+	          }
3549
+	          
3550
+	          writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.CLOAK));
3551
+	          
3552
+	          if (_player.getWeaponSkinOption() > 0 && getWeaponOption(_player.getWeaponSkinOption()) != null)
3553
+	          {
3554
+	              writeD(getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() != 0 ? getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() : _player.getInventory().getItemObjectIdFrom(Paperdoll.RHAND));
3555
+	          }
3556
+	          else
3557
+	          {
3558
+	              writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.RHAND));
3559
+	          }
3560
+	          
3561
+	          if (_player.getHairSkinOption() > 0 && getHairOption(_player.getHairSkinOption()) != null)
3562
+	          {
3563
+	              writeD(getHairOption(_player.getHairSkinOption()).getHairId() != 0 ? getHairOption(_player.getHairSkinOption()).getHairId() : _player.getInventory().getItemObjectIdFrom(Paperdoll.HAIR));
3564
+	          }
3565
+	          else
3566
+	          {
3567
+	              writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.HAIR));
3568
+	          }
3569
+	          
3570
+	          if (_player.getFaceSkinOption() > 0 && getFaceOption(_player.getFaceSkinOption()) != null)
3571
+	          {
3572
+	              writeD(getFaceOption(_player.getFaceSkinOption()).getFaceId() != 0 ? getFaceOption(_player.getFaceSkinOption()).getFaceId() : _player.getInventory().getItemObjectIdFrom(Paperdoll.FACE));
3573
+	          }
3574
+	          else
3575
+	          {
3576
+	              writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.FACE));
3577
+	          }
3578
+	          
3579
+	      }
3580
+	      else {
3581
+	          writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.RHAND));
3582
+	          writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.LHAND));
3583
+	          writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.GLOVES));
3584
+	          writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.CHEST));
3585
+	          writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.LEGS));
3586
+	          writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.FEET));
3587
+	          writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.CLOAK));
3588
+	          writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.RHAND));
3589
+	          writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.HAIR));
3590
+	          writeD(_player.getInventory().getItemObjectIdFrom(Paperdoll.FACE));
3591
+	      }
3592
 		
3593
 		writeD(_player.getInventory().getItemIdFrom(Paperdoll.HAIRALL));
3594
 		writeD(_player.getInventory().getItemIdFrom(Paperdoll.REAR));
3595
@@ -81,16 +151,83 @@
3596
 		writeD(_player.getInventory().getItemIdFrom(Paperdoll.RFINGER));
3597
 		writeD(_player.getInventory().getItemIdFrom(Paperdoll.LFINGER));
3598
 		writeD(_player.getInventory().getItemIdFrom(Paperdoll.HEAD));
3599
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3600
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.LHAND));
3601
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.GLOVES));
3602
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.CHEST));
3603
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.LEGS));
3604
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.FEET));
3605
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.CLOAK));
3606
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3607
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.HAIR));
3608
-		writeD(_player.getInventory().getItemIdFrom(Paperdoll.FACE));
3609
+	       if (Config.ALLOW_DRESS_ME_SYSTEM)
3610
+	       {
3611
+	           if (_player.getWeaponSkinOption() > 0 && getWeaponOption(_player.getWeaponSkinOption()) != null)
3612
+	           {
3613
+	               writeD(getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() != 0 ? getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() : _player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3614
+	           }
3615
+	           else
3616
+	           {
3617
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3618
+	           }
3619
+	           
3620
+	           if (_player.getShieldSkinOption() > 0 && getShieldOption(_player.getShieldSkinOption()) != null)
3621
+	           {
3622
+	               writeD(getShieldOption(_player.getShieldSkinOption()).getShieldId() != 0 ? getShieldOption(_player.getShieldSkinOption()).getShieldId() : _player.getInventory().getItemIdFrom(Paperdoll.LHAND));
3623
+	           }
3624
+	           else
3625
+	           {
3626
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.LHAND));
3627
+	           }
3628
+	           
3629
+	           if (_player.getArmorSkinOption() > 0 && getArmorOption(_player.getArmorSkinOption()) != null)
3630
+	           {
3631
+	               writeD(getArmorOption(_player.getArmorSkinOption()).getGlovesId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getGlovesId() : _player.getInventory().getItemIdFrom(Paperdoll.GLOVES));
3632
+	               writeD(getArmorOption(_player.getArmorSkinOption()).getChestId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getChestId() : _player.getInventory().getItemIdFrom(Paperdoll.CHEST));
3633
+	               writeD(getArmorOption(_player.getArmorSkinOption()).getLegsId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getLegsId() : _player.getInventory().getItemIdFrom(Paperdoll.LEGS));
3634
+	               writeD(getArmorOption(_player.getArmorSkinOption()).getFeetId() != 0 ? getArmorOption(_player.getArmorSkinOption()).getFeetId() : _player.getInventory().getItemIdFrom(Paperdoll.FEET));
3635
+	           }
3636
+	           else
3637
+	           {
3638
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.GLOVES));
3639
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.CHEST));
3640
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.LEGS));
3641
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.FEET));
3642
+	           }
3643
+	           
3644
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.CLOAK));
3645
+	           
3646
+	           if (_player.getWeaponSkinOption() > 0 && getWeaponOption(_player.getWeaponSkinOption()) != null)
3647
+	           {
3648
+	               writeD(getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() != 0 ? getWeaponOption(_player.getWeaponSkinOption()).getWeaponId() : _player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3649
+	           }
3650
+	           else
3651
+	           {
3652
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3653
+	           }
3654
+	           
3655
+	           if (_player.getHairSkinOption() > 0 && getHairOption(_player.getHairSkinOption()) != null)
3656
+	           {
3657
+	               writeD(getHairOption(_player.getHairSkinOption()).getHairId() != 0 ? getHairOption(_player.getHairSkinOption()).getHairId() : _player.getInventory().getItemIdFrom(Paperdoll.HAIR));
3658
+	           }
3659
+	           else
3660
+	           {
3661
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.HAIR));
3662
+	           }
3663
+	           
3664
+	           if (_player.getFaceSkinOption() > 0 && getFaceOption(_player.getFaceSkinOption()) != null)
3665
+	           {
3666
+	               writeD(getFaceOption(_player.getFaceSkinOption()).getFaceId() != 0 ? getFaceOption(_player.getFaceSkinOption()).getFaceId() : _player.getInventory().getItemIdFrom(Paperdoll.FACE));
3667
+	           }
3668
+	           else
3669
+	           {
3670
+	               writeD(_player.getInventory().getItemIdFrom(Paperdoll.FACE));
3671
+	           }
3672
+	           
3673
+	       }
3674
+	       else {
3675
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3676
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.LHAND));
3677
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.GLOVES));
3678
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.CHEST));
3679
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.LEGS));
3680
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.FEET));
3681
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.CLOAK));
3682
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.RHAND));
3683
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.HAIR));
3684
+	           writeD(_player.getInventory().getItemIdFrom(Paperdoll.FACE));
3685
+	       }
3686
 		
3687
 		writeH(0x00);
3688
 		writeH(0x00);
3689
@@ -214,4 +351,28 @@
3690
 		writeD(_player.getAppearance().getTitleColor());
3691
 		writeD(CursedWeaponManager.getInstance().getCurrentStage(_player.getCursedWeaponEquippedId()));
3692
 	}
3693
+    public SkinPackage getArmorOption(int option)
3694
+    {
3695
+        return (DressMeData.getInstance().getArmorSkinsPackage(option));
3696
+    }
3697
+    
3698
+    public SkinPackage getWeaponOption(int option)
3699
+    {
3700
+        return DressMeData.getInstance().getWeaponSkinsPackage(option);
3701
+    }
3702
+    
3703
+    public SkinPackage getHairOption(int option)
3704
+    {
3705
+        return DressMeData.getInstance().getHairSkinsPackage(option);
3706
+    }
3707
+    
3708
+    public SkinPackage getFaceOption(int option)
3709
+    {
3710
+        return DressMeData.getInstance().getFaceSkinsPackage(option);
3711
+    }
3712
+    
3713
+    public SkinPackage getShieldOption(int option)
3714
+    {
3715
+        return DressMeData.getInstance().getShieldSkinsPackage(option);
3716
+    }
3717
 }
3718
\ No newline at end of file
3719
diff --git server/gameserver/data/html/dressme/allskins.htm server/gameserver/data/html/dressme/allskins.htm
3720
new file mode 100644
3721
index 0000000..c865d6a
3722
--- /dev/null
3723
+++ server/gameserver/data/html/dressme/allskins.htm
3724
@@ -0,0 +1,20 @@
3725
+<html>
3726
+<body>
3727
+<img src="L2UI.Squaregray" width="300" height="1">
3728
+<table width=300 border=0 cellspacing=0 cellpadding=1 bgcolor=000000 height=15>
3729
+<tr>
3730
+<td width=36 align=center></td>
3731
+<td width=120 align=left>Name</td>
3732
+<td width=65 align=left>Actions</td>
3733
+</tr>
3734
+</table>
3735
+<img src="L2UI.Squaregray" width="300" height="1">
3736
+
3737
+%showList%
3738
+
3739
+<center>
3740
+<button value="Back" action="bypass -h custom_dressme_back" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2">
3741
+</center>
3742
+
3743
+</body>
3744
+</html>
3745
\ No newline at end of file
3746
diff --git server/gameserver/data/html/dressme/index.htm server/gameserver/data/html/dressme/index.htm
3747
new file mode 100644
3748
index 0000000..f03dd39
3749
--- /dev/null
3750
+++ server/gameserver/data/html/dressme/index.htm
3751
@@ -0,0 +1,26 @@
3752
+<html>
3753
+<title>Skins Shop</title>
3754
+<body>
3755
+<br>
3756
+<center>Skins:</center>
3757
+
3758
+<table width=300>
3759
+<tr>
3760
+<td align=center><button value="Armor buy/try" action="bypass -h dressme 1 skinlist armor" width=134 height=19 back="L2UI_ch3.BigButton3_over" fore="L2UI_ch3.BigButton3"></td>
3761
+</tr>
3762
+<tr>
3763
+<td align=center><button value="Weapon buy/try" action="bypass -h dressme 1 skinlist weapon" width=134 height=19 back="L2UI_ch3.BigButton3_over" fore="L2UI_ch3.BigButton3"></td>
3764
+</tr>
3765
+<tr>
3766
+<td align=center><button value="Hair buy/try" action="bypass -h dressme 1 skinlist hair" width=134 height=19 back="L2UI_ch3.BigButton3_over" fore="L2UI_ch3.BigButton3"></td>
3767
+</tr>
3768
+<tr>
3769
+<td align=center><button value="Face buy/try" action="bypass -h dressme 1 skinlist face" width=134 height=19 back="L2UI_ch3.BigButton3_over" fore="L2UI_ch3.BigButton3"></td>
3770
+</tr>
3771
+<tr>
3772
+<td align=center><button value="Shield buy/try" action="bypass -h dressme 1 skinlist shield" width=134 height=19 back="L2UI_ch3.BigButton3_over" fore="L2UI_ch3.BigButton3"></td>
3773
+</tr>
3774
+<tr>
3775
+<td align=center><button value="My skins" action="bypass -h dressme 1 myskinlist" width=134 height=19 back="L2UI_ch3.BigButton3_over" fore="L2UI_ch3.BigButton3"></td>
3776
+</tr>
3777
+</table>
3778
diff --git server/gameserver/data/html/dressme/myskins.htm server/gameserver/data/html/dressme/myskins.htm
3779
new file mode 100644
3780
index 0000000..2547f1e
3781
--- /dev/null
3782
+++ server/gameserver/data/html/dressme/myskins.htm
3783
@@ -0,0 +1,21 @@
3784
+<html>
3785
+<body>
3786
+<img src="L2UI.Squaregray" width="300" height="1">
3787
+<table border=0 cellspacing=0 cellpadding=2 bgcolor=000000 height=20>
3788
+<tr>
3789
+<td width=32 align=center></td>
3790
+<td width=203 align=left>Name</td>
3791
+<td width=65 align=left>Actions</td>
3792
+</tr>
3793
+</table>
3794
+<img src="L2UI.Squaregray" width="300" height="1">
3795
+
3796
+%showList%
3797
+
3798
+<br>
3799
+<br>
3800
+<center>
3801
+<button value="Back" action="bypass -h custom_dressme_back" width=65 height=19 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal">
3802
+</center>
3803
+</body>
3804
+</html>
3805
\ No newline at end of file
3806
diff --git server/gameserver/data/xml/dressme.xml server/gameserver/data/xml/dressme.xml
3807
new file mode 100644
3808
index 0000000..cd823a3
3809
--- /dev/null
3810
+++ server/gameserver/data/xml/dressme.xml
3811
@@ -0,0 +1,22 @@
3812
+<?xml version="1.0" encoding="UTF-8"?>
3813
+<list>
3814
+	<skin type="armor"> <!-- Armors -->
3815
+		<type id="1" name="Draconic Armor" chestId="6379" legsId="0" glovesId="6380" feetId="6381" priceId="57" priceCount="100"/>
3816
+		<type id="2" name="Blue Wolf Leather Armor" chestId="2391" legsId="0" glovesId="0" feetId="0" priceId="57" priceCount="100"/>
3817
+	</skin>
3818
+	<skin type="weapon"> <!-- Weapons -->
3819
+		<type id="1" name="Draconic Bow" weaponId="7575" priceId="57" priceCount="100"/>
3820
+		<type id="2" name="Arcana Mace" weaponId="6608"  priceId="57" priceCount="100"/>
3821
+		<type id="3" name="Keshanberk*Keshanberk" weaponId="5704" priceId="57" priceCount="100"/>
3822
+	</skin>
3823
+	<skin type="hair"> <!-- Hairs -->
3824
+		<type id="1" name="Cat Ear" hairId="6843" priceId="57" priceCount="100"/>
3825
+	</skin>
3826
+	<skin type="face"> <!-- Faces -->
3827
+		<type id="1" name="Party Mask" faceId="5808" priceId="57" priceCount="100"/>
3828
+	</skin>
3829
+	<skin type="shield"> <!-- Shields -->
3830
+		<type id="1" name="Shield of Night" shieldId="2498" priceId="57" priceCount="100"/>
3831
+		<type id="2" name="Imperial Shield" shieldId="6377" priceId="57" priceCount="100"/>
3832
+	</skin>
3833
+</list>
3834
\ No newline at end of file
3835