View difference between Paste ID: f2Urnv0M and Tc9hag5h
SHOW: | | - or go back to the newest paste.
1
### Eclipse Workspace Patch 1.0
2
#P L2J_Server
3
Index: java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java
4
===================================================================
5
--- java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java	(revision 5563)
6
+++ java/com/l2jserver/gameserver/network/clientpackets/RequestBypassToServer.java	(working copy)
7
@@ -25,6 +25,8 @@
8
 import com.l2jserver.gameserver.handler.BypassHandler;
9
 import com.l2jserver.gameserver.handler.IAdminCommandHandler;
10
 import com.l2jserver.gameserver.handler.IBypassHandler;
11
+import com.l2jserver.gameserver.handler.IVoicedCommandHandler;
12
+import com.l2jserver.gameserver.handler.VoicedCommandHandler;
13
 import com.l2jserver.gameserver.model.L2CharPosition;
14
 import com.l2jserver.gameserver.model.L2Object;
15
 import com.l2jserver.gameserver.model.L2World;
16
@@ -117,6 +119,17 @@
17
 					ach.useAdminCommand(_command, activeChar);
18
 				}
19
 			}
20
+			else if (_command.startsWith(".")) {
21
+				String command = _command.substring(1).split(" ")[0];
22
+				String params = _command.substring(1).split(" ").length > 1 ? _command.substring(1).split(" ")[1] : "";
23
+				IVoicedCommandHandler vch = VoicedCommandHandler.getInstance().getHandler(command);
24
+				if (vch == null)
25
+				{
26
+					_log.warning(activeChar + " requested not registered admin command '" + command + "'");
27
+					return;
28
+				}
29
+				vch.useVoicedCommand(command, activeChar, params);
30
+			}
31
 			else if (_command.equals("come_here") && activeChar.isGM())
32
 			{
33
 				comeHere(activeChar);
34
Index: java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
35
===================================================================
36
--- java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java	(revision 5563)
37
+++ java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java	(working copy)
38
@@ -7466,6 +7466,7 @@
39
 				player.restoreUISettings();
40
 			
41
 			player.restoreZoneRestartLimitTime();
42
+			player.restoreVisualArmors();
43
 		}
44
 		catch (Exception e)
45
 		{
46
@@ -7728,6 +7729,7 @@
47
 		storeCharSub();
48
 		storeEffect(storeActiveEffects);
49
 		storeItemReuseDelay();
50
+		storeVisualArmors();
51
 		transformInsertInfo();
52
 		if(Config.STORE_RECIPE_SHOPLIST)
53
 			storeRecipeShopList();
54-
@@ -15471,4 +15473,298 @@
54+
@@ -15471,4 +15473,300 @@
55
 	{
56
 		globalProfessionChangeListeners.remove(listener);
57
 	}
58
+
59
+	private void restoreVisualArmors()
60
+	{
61-
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
61+
+		try
62-
+			PreparedStatement statement = con.prepareStatement("SELECT * FROM character_visual_armors WHERE charId=?"))
62+
63
+			Connection con = L2DatabaseFactory.getInstance().getConnection();
64
+			PreparedStatement statement = con.prepareStatement("SELECT * FROM character_visual_armors WHERE charId=?");
65-
+			try (ResultSet rset = statement.executeQuery())
65+
66
+			ResultSet rset = statement.executeQuery();
67
+			if (rset.next())
68
+			{
69-
+					isUsingVisualArmors(rset.getBoolean("isUsingVisual"));
69+
+				isUsingVisualArmors(rset.getBoolean("isUsingVisual"));
70-
+					setVisualArmor(VisualArmors.Armor, rset.getInt("armor"));
70+
+				setVisualArmor(VisualArmors.Armor, rset.getInt("armor"));
71-
+					setVisualArmor(VisualArmors.Legs, rset.getInt("leggings"));
71+
+				setVisualArmor(VisualArmors.Legs, rset.getInt("leggings"));
72-
+					setVisualArmor(VisualArmors.Feet, rset.getInt("feet"));
72+
+				setVisualArmor(VisualArmors.Feet, rset.getInt("feet"));
73-
+					setVisualArmor(VisualArmors.Gloves, rset.getInt("gloves"));
73+
+				setVisualArmor(VisualArmors.Gloves, rset.getInt("gloves"));
74-
+					setVisualArmor(VisualArmors.LHand, rset.getInt("lHand"));
74+
+				setVisualArmor(VisualArmors.LHand, rset.getInt("lHand"));
75-
+					setVisualArmor(VisualArmors.Sword, rset.getInt("sword"));
75+
+				setVisualArmor(VisualArmors.Sword, rset.getInt("sword"));
76-
+					setVisualArmor(VisualArmors.Bow, rset.getInt("bow"));
76+
+				setVisualArmor(VisualArmors.Bow, rset.getInt("bow"));
77-
+					setVisualArmor(VisualArmors.Pole, rset.getInt("pole"));
77+
+				setVisualArmor(VisualArmors.Pole, rset.getInt("pole"));
78-
+					setVisualArmor(VisualArmors.Dual, rset.getInt("dualWeapons"));
78+
+				setVisualArmor(VisualArmors.Dual, rset.getInt("dualWeapons"));
79-
+					setVisualArmor(VisualArmors.BigSword, rset.getInt("bigSword"));
79+
+				setVisualArmor(VisualArmors.BigSword, rset.getInt("bigSword"));
80
+			}
81
+		}
82
+		catch (Exception e)
83
+		{
84
+			_log.log(Level.WARNING, "Could not restore " + getObjectId() + " visual armors data " + e.getMessage(), e);
85
+		}
86
+	}
87
+	
88
+	private boolean checkIfExist()
89
+	{
90
+		try
91-
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
91+
92-
+			PreparedStatement statement = con.prepareStatement("SELECT charId FROM character_visual_armors WHERE charId=?"))
92+
+			Connection con = L2DatabaseFactory.getInstance().getConnection();
93
+			PreparedStatement statement = con.prepareStatement("SELECT charId FROM character_visual_armors WHERE charId=?");
94
+			statement.setInt(1, getObjectId());
95
+			try (ResultSet rset = statement.executeQuery()) {
96
+				if (rset.next())
97
+					return true;
98
+			}
99
+		}
100
+		catch (Exception e)
101
+		{
102
+			_log.log(Level.WARNING, "Could not restore " + getObjectId() + " visual armors data " + e.getMessage(), e);
103
+		}
104
+		return false;
105
+	}
106
+	
107
+	private void storeVisualArmors()
108
+	{
109
+		if (!checkIfExist())
110
+			insertVisualArmors();
111
+		//UPDATE characters SET vitality_points=?,language=? WHERE charId=?";
112-
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
112+
+		try
113-
+			PreparedStatement statement = con.prepareStatement("UPDATE character_visual_armors SET isUsingVisual=?,armor=?,leggings=?,feet=?,gloves=?,sword=?,bow=?,pole=?,dualWeapons=?,bigSword=?,lHand=? WHERE charId=?"))
113+
114
+			Connection con = L2DatabaseFactory.getInstance().getConnection();
115
+			PreparedStatement statement = con.prepareStatement("UPDATE character_visual_armors SET isUsingVisual=?,armor=?,leggings=?,feet=?,gloves=?,sword=?,bow=?,pole=?,dualWeapons=?,bigSword=?,lHand=? WHERE charId=?");
116
+			statement.setInt(1, isUsingVisualArmors() ? 1 : 0);
117
+			statement.setInt(2, getVisualArmor(VisualArmors.Armor, true) == null ? 0 : getVisualArmor(VisualArmors.Armor, true).getItemId());
118
+			statement.setInt(3, getVisualArmor(VisualArmors.Legs, true) == null ? 0 : getVisualArmor(VisualArmors.Legs, true).getItemId());
119
+			statement.setInt(4, getVisualArmor(VisualArmors.Feet, true) == null ? 0 : getVisualArmor(VisualArmors.Feet, true).getItemId());
120
+			statement.setInt(5, getVisualArmor(VisualArmors.Gloves, true) == null ? 0 : getVisualArmor(VisualArmors.Gloves, true).getItemId());
121
+			statement.setInt(6, getVisualArmor(VisualArmors.Sword, true) == null ? 0 : getVisualArmor(VisualArmors.Sword, true).getItemId());
122
+			statement.setInt(7, getVisualArmor(VisualArmors.Bow, true) == null ? 0 : getVisualArmor(VisualArmors.Bow, true).getItemId());
123
+			statement.setInt(8, getVisualArmor(VisualArmors.Pole, true) == null ? 0 : getVisualArmor(VisualArmors.Pole, true).getItemId());
124
+			statement.setInt(9, getVisualArmor(VisualArmors.Dual, true) == null ? 0 : getVisualArmor(VisualArmors.Dual, true).getItemId());
125
+			statement.setInt(10, getVisualArmor(VisualArmors.BigSword, true) == null ? 0 : getVisualArmor(VisualArmors.BigSword, true).getItemId());
126
+			statement.setInt(11, getVisualArmor(VisualArmors.LHand, true) == null ? 0 : getVisualArmor(VisualArmors.LHand, true).getItemId());
127
+			statement.setInt(12, getObjectId());
128
+			statement.execute();
129
+		}
130
+		catch (Exception e)
131
+		{
132
+			_log.log(Level.WARNING, "Could not store character " + getObjectId() + " visual armors data: ", e);
133
+		}
134
+	}
135
+
136
+	private boolean insertVisualArmors()
137-
+		try (Connection con = L2DatabaseFactory.getInstance().getConnection();
137+
138-
+			PreparedStatement statement = con.prepareStatement("INSERT INTO character_visual_armors (charId) values (?)"))
138+
+		try
139
+		{
140
+			Connection con = L2DatabaseFactory.getInstance().getConnection();
141
+			PreparedStatement statement = con.prepareStatement("INSERT INTO character_visual_armors (charId) values (?)");
142
+			statement.setInt(1, getObjectId());
143
+			statement.executeUpdate();
144
+		}
145
+		catch (Exception e)
146
+		{
147
+			_log.log(Level.SEVERE, "Could not insert character " + getObjectId() + " visual armors data: " + e.getMessage(), e);
148
+			return false;
149
+		}
150
+		return true;
151
+	}
152
+	
153
+	boolean isUsingVisualArmors = false;
154
+
155
+	public boolean isUsingVisualArmors() {
156
+		return isUsingVisualArmors;
157
+	}
158
+
159
+	public void isUsingVisualArmors(boolean _isUsingVisualArmors) {
160
+		isUsingVisualArmors = _isUsingVisualArmors;
161
+	}
162
+
163
+	public enum VisualArmors {
164
+		Sword,
165
+		Bow,
166
+		Pole,
167
+		Dual,
168
+		BigSword,
169
+		RHand,
170
+		LHand,
171
+		Armor,
172
+		Legs,
173
+		Feet,
174
+		Gloves,
175
+		Cloak
176
+	}
177
+
178
+	int visualArmors[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
179
+
180
+	public void setVisualArmor(VisualArmors position, int itemId) { 
181
+		visualArmors[position.ordinal()] = itemId;
182
+	}
183
+
184
+	public L2Item getVisualArmor(VisualArmors position, boolean forceShow) {
185
+		switch (position) {
186
+			case Sword:
187
+				if (visualArmors[VisualArmors.Sword.ordinal()] > 0)
188
+					return ItemTable.getInstance().getTemplate(visualArmors[VisualArmors.Sword.ordinal()]);
189
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND) != null)
190
+					switch (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getWeaponItem().getItemType()) {
191
+						case SWORD:
192
+						case BLUNT:
193
+						case DAGGER:
194
+						case ETC:
195
+						case FIST:
196
+						case RAPIER:
197
+							return getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getItem();
198
+					}
199
+				return null;
200
+			case Bow:
201
+				if (visualArmors[VisualArmors.Bow.ordinal()] > 0)
202
+					return ItemTable.getInstance().getTemplate(visualArmors[VisualArmors.Bow.ordinal()]);
203
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND) != null)
204
+					switch (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getWeaponItem().getItemType()) {
205
+						case BOW:
206
+						case CROSSBOW:
207
+							return getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getItem();
208
+					}
209
+				return null;
210
+			case Pole:
211
+				if (visualArmors[VisualArmors.Pole.ordinal()] > 0)
212
+					return ItemTable.getInstance().getTemplate(visualArmors[VisualArmors.Pole.ordinal()]);
213
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND) != null)
214
+					switch (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getWeaponItem().getItemType()) {
215
+						case POLE:
216
+							return getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getItem();
217
+					}
218
+				return null;
219
+			case BigSword:
220
+				if (visualArmors[VisualArmors.BigSword.ordinal()] > 0)
221
+					return ItemTable.getInstance().getTemplate(visualArmors[VisualArmors.BigSword.ordinal()]);
222
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND) != null)
223
+					switch (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getWeaponItem().getItemType()) {
224
+						case ANCIENTSWORD:
225
+						case BIGBLUNT:
226
+						case BIGSWORD:
227
+							return getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getItem();
228
+					}
229
+				return null;
230
+			case Dual:
231
+				if (visualArmors[VisualArmors.Dual.ordinal()] > 0)
232
+					return ItemTable.getInstance().getTemplate(visualArmors[VisualArmors.Dual.ordinal()]);
233
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND) != null)
234
+					switch (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getWeaponItem().getItemType()) {
235
+						case DUAL:
236
+						case DUALFIST:
237
+						case DUALDAGGER:
238
+							return getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getItem();
239
+					}
240
+				return null;
241
+			case RHand:
242
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND) == null && !forceShow)
243
+					return null;
244
+				else if (isUsingVisualArmors() || forceShow) {
245
+					switch (getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getWeaponItem().getItemType()) {
246
+						case SWORD:
247
+						case BLUNT:
248
+						case DAGGER:
249
+						case ETC:
250
+						case FIST:
251
+						case RAPIER:
252
+							if (visualArmors[VisualArmors.Sword.ordinal()] > 0)
253
+								return ItemTable.getInstance().getTemplate(visualArmors[VisualArmors.Sword.ordinal()]);
254
+							break;
255
+						case BOW:
256-
+								return ItemTable.getInstance().getTemplate(VisualArmors.Bow.ordinal());
256+
257
+							if (visualArmors[VisualArmors.Bow.ordinal()] > 0)
258
+								return ItemTable.getInstance().getTemplate(visualArmors[VisualArmors.Bow.ordinal()]);
259
+							break;
260
+						case POLE:
261
+							if (visualArmors[VisualArmors.Pole.ordinal()] > 0)
262
+								return ItemTable.getInstance().getTemplate(visualArmors[VisualArmors.Pole.ordinal()]);
263
+							break;
264
+						case DUAL:
265
+						case DUALFIST:
266
+						case DUALDAGGER:
267
+							if (visualArmors[VisualArmors.Dual.ordinal()] > 0)
268
+								return ItemTable.getInstance().getTemplate(visualArmors[VisualArmors.Dual.ordinal()]);
269
+							break;
270
+						case ANCIENTSWORD:
271
+						case BIGBLUNT:
272
+						case BIGSWORD:
273
+							if (visualArmors[VisualArmors.BigSword.ordinal()] > 0)
274
+								return ItemTable.getInstance().getTemplate(visualArmors[VisualArmors.BigSword.ordinal()]);
275
+							break;
276
+						default:
277
+							return getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getItem();
278
+					}
279
+				}
280
+				return getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getItem();
281
+			case LHand:
282
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND) == null) {
283
+					if (visualArmors[position.ordinal()] > 0 && forceShow)
284
+						return ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
285
+					return null;
286
+				}
287
+				else if ((isUsingVisualArmors() || forceShow) && visualArmors[position.ordinal()] > 0) {
288
+					L2Item item = ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
289
+					if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND).isArmor() && item instanceof L2Armor)
290
+						return item;
291
+					return null;
292
+				}
293
+				else
294
+					return getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND).getItem();
295
+			case Armor:
296
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST) == null) {
297
+					if (visualArmors[position.ordinal()] > 0 && forceShow)
298
+						return ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
299
+					return null;
300
+				}
301
+				else if ((isUsingVisualArmors() || forceShow) && visualArmors[position.ordinal()] > 0)
302
+					return ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
303
+				else
304
+					return getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST).getItem();
305
+			case Legs:
306
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEGS) == null) {
307
+					if (visualArmors[position.ordinal()] > 0 && forceShow)
308
+						return ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
309
+					return null;
310
+				}
311
+				else if (isUsingVisualArmors() || forceShow) {
312
+					L2Item armor = getVisualArmor(VisualArmors.Armor, true);
313
+					if (armor.getBodyPart() == L2Item.SLOT_FULL_ARMOR)
314
+						return null;
315
+					if (visualArmors[position.ordinal()] > 0)
316
+						return ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
317
+					return getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEGS).getItem();
318
+				}
319
+				else
320
+					return getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEGS).getItem();
321
+			case Feet:
322
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_FEET) == null) {
323
+					if (visualArmors[position.ordinal()] > 0 && forceShow)
324
+						return ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
325
+					return null;
326
+				}
327
+				else if ((isUsingVisualArmors() || forceShow) && visualArmors[position.ordinal()] > 0)
328
+					return ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
329
+				else
330
+					return getInventory().getPaperdollItem(Inventory.PAPERDOLL_FEET).getItem();
331
+			case Gloves:
332
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES) == null) {
333
+					if (visualArmors[position.ordinal()] > 0 && forceShow)
334
+						return ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
335
+					return null;
336
+				}
337
+				else if ((isUsingVisualArmors() || forceShow) && visualArmors[position.ordinal()] > 0)
338
+					return ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
339
+				else
340
+					return getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES).getItem();
341
+			case Cloak:
342
+				if (getInventory().getPaperdollItem(Inventory.PAPERDOLL_CLOAK) == null) {
343
+					if (visualArmors[position.ordinal()] > 0 && forceShow)
344
+						return ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
345
+					return null;
346
+				}
347
+				else if ((isUsingVisualArmors() || forceShow) && visualArmors[position.ordinal()] > 0)
348
+					return ItemTable.getInstance().getTemplate(visualArmors[position.ordinal()]);
349
+				else
350
+					return getInventory().getPaperdollItem(Inventory.PAPERDOLL_CLOAK).getItem();
351
+		}
352
+		return null;
353
+	}
354
 }
355
\ No newline at end of file
356
Index: java/com/l2jserver/gameserver/network/serverpackets/CharInfo.java
357
===================================================================
358
--- java/com/l2jserver/gameserver/network/serverpackets/CharInfo.java	(revision 5563)
359
+++ java/com/l2jserver/gameserver/network/serverpackets/CharInfo.java	(working copy)
360
@@ -19,6 +19,7 @@
361
 import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager;
362
 import com.l2jserver.gameserver.model.actor.L2Decoy;
363
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
364
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance.VisualArmors;
365
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
366
 import com.l2jserver.gameserver.model.effects.AbnormalEffect;
367
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
368
@@ -196,15 +197,15 @@
369
 			
370
 			writeD(_inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_UNDER));
371
 			writeD(_inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_HEAD));
372
+
373
+			writeD(_activeChar.getVisualArmor(VisualArmors.RHand, false) != null ? _activeChar.getVisualArmor(VisualArmors.RHand, false).getItemId() : 0x00);
374
+			writeD(_activeChar.getVisualArmor(VisualArmors.LHand, false) != null ? _activeChar.getVisualArmor(VisualArmors.LHand, false).getItemId() : 0x00);
375
 			
376
-			writeD(_airShipHelm == 0 ? _inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_RHAND) : _airShipHelm);
377
-			writeD(_airShipHelm == 0 ? _inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_LHAND) : 0);
378
-			
379
-			writeD(_inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_GLOVES));
380
-			writeD(_inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_CHEST));
381
-			writeD(_inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_LEGS));
382
-			writeD(_inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_FEET));
383
-			writeD(_inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_CLOAK));
384
+			writeD(_activeChar.getVisualArmor(VisualArmors.Gloves, false) != null ? _activeChar.getVisualArmor(VisualArmors.Gloves, false).getItemId() : 0x00);
385
+			writeD(_activeChar.getVisualArmor(VisualArmors.Armor, false) != null ? _activeChar.getVisualArmor(VisualArmors.Armor, false).getItemId() : 0x00);
386
+			writeD(_activeChar.getVisualArmor(VisualArmors.Legs, false) != null ? _activeChar.getVisualArmor(VisualArmors.Legs, false).getItemId() : 0x00);
387
+			writeD(_activeChar.getVisualArmor(VisualArmors.Feet, false) != null ? _activeChar.getVisualArmor(VisualArmors.Feet, false).getItemId() : 0x00);
388
+			writeD(_activeChar.getVisualArmor(VisualArmors.Cloak, false) != null ? _activeChar.getVisualArmor(VisualArmors.Cloak, false).getItemId() : 0x00);
389
 			writeD(_inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_RHAND));
390
 			writeD(_inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_HAIR));
391
 			writeD(_inv.getPaperdollItemDisplayId(Inventory.PAPERDOLL_HAIR2));
392
Index: java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java
393
===================================================================
394
--- java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java	(revision 5563)
395
+++ java/com/l2jserver/gameserver/network/serverpackets/UserInfo.java	(working copy)
396
@@ -21,6 +21,7 @@
397
 import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
398
 import com.l2jserver.gameserver.model.Elementals;
399
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
400
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance.VisualArmors;
401
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
402
 import com.l2jserver.gameserver.model.effects.AbnormalEffect;
403
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
404
@@ -143,15 +144,15 @@
405
 		writeD(_activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_LFINGER));
406
 		writeD(_activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_HEAD));
407
 		
408
-		writeD(_airShipHelm == 0 ? _activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_RHAND) : 0);
409
-		writeD(_airShipHelm == 0 ? _activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_LHAND) : 0);
410
+		writeD(_activeChar.getVisualArmor(VisualArmors.RHand, false) != null ? _activeChar.getVisualArmor(VisualArmors.RHand, false).getItemId() : 0x00);
411
+		writeD(_activeChar.getVisualArmor(VisualArmors.LHand, false) != null ? _activeChar.getVisualArmor(VisualArmors.LHand, false).getItemId() : 0x00);
412
 		
413
-		writeD(_activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_GLOVES));
414
-		writeD(_activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_CHEST));
415
-		writeD(_activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_LEGS));
416
-		writeD(_activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_FEET));
417
-		writeD(_activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_CLOAK));
418
-		writeD(_activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_RHAND));
419
+		writeD(_activeChar.getVisualArmor(VisualArmors.Gloves, false) != null ? _activeChar.getVisualArmor(VisualArmors.Gloves, false).getItemId() : 0x00);
420
+		writeD(_activeChar.getVisualArmor(VisualArmors.Armor, false) != null ? _activeChar.getVisualArmor(VisualArmors.Armor, false).getItemId() : 0x00);
421
+		writeD(_activeChar.getVisualArmor(VisualArmors.Legs, false) != null ? _activeChar.getVisualArmor(VisualArmors.Legs, false).getItemId() : 0x00);
422
+		writeD(_activeChar.getVisualArmor(VisualArmors.Feet, false) != null ? _activeChar.getVisualArmor(VisualArmors.Feet, false).getItemId() : 0x00);
423
+		writeD(_activeChar.getVisualArmor(VisualArmors.Cloak, false) != null ? _activeChar.getVisualArmor(VisualArmors.Cloak, false).getItemId() : 0x00);
424
+		writeD(_activeChar.getVisualArmor(VisualArmors.RHand, false) != null ? _activeChar.getVisualArmor(VisualArmors.RHand, false).getItemId() : 0x00);
425
 		writeD(_activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_HAIR));
426
 		writeD(_activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_HAIR2));
427
 		writeD(_activeChar.getInventory().getPaperdollItemDisplayId(Inventory.PAPERDOLL_RBRACELET));
428
#P L2J_DataPack
429
Index: dist/game/data/scripts/handlers/MasterHandler.java
430
===================================================================
431
--- dist/game/data/scripts/handlers/MasterHandler.java	(revision 9067)
432
+++ dist/game/data/scripts/handlers/MasterHandler.java	(working copy)
433
@@ -288,6 +288,7 @@
434
 import handlers.voicedcommandhandlers.ChangePassword;
435
 import handlers.voicedcommandhandlers.ChatAdmin;
436
 import handlers.voicedcommandhandlers.Debug;
437
+import handlers.voicedcommandhandlers.DressMe;
438
 import handlers.voicedcommandhandlers.Hellbound;
439
 import handlers.voicedcommandhandlers.Lang;
440
 import handlers.voicedcommandhandlers.StatsVCmd;
441
@@ -603,6 +604,7 @@
442
 			(Config.L2JMOD_DEBUG_VOICE_COMMAND ? Debug.class : null),
443
 			(Config.L2JMOD_ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null),
444
 			(Config.L2JMOD_HELLBOUND_STATUS ? Hellbound.class : null),
445
+			DressMe.class
446
 		},
447
 		{
448
 			// Target Handlers
449
Index: dist/sql/game/character_visual_armors.sql
450
===================================================================
451
--- dist/sql/game/character_visual_armors.sql	(revision 0)
452
+++ dist/sql/game/character_visual_armors.sql	(working copy)
453
@@ -0,0 +1,15 @@
454
+CREATE TABLE IF NOT EXISTS `character_visual_armors` (
455
+  `charId` int(10) unsigned NOT NULL DEFAULT '0',
456
+  `isUsingVisual` tinyint(3) NOT NULL DEFAULT '0',
457
+  `armor` int(10) NOT NULL DEFAULT '0',
458
+  `leggings` int(10) NOT NULL DEFAULT '0',
459
+  `feet` int(10) NOT NULL DEFAULT '0',
460
+  `gloves` int(10) NOT NULL DEFAULT '0',
461
+  `lHand` int(10) NOT NULL DEFAULT '0',
462
+  `sword` int(10) NOT NULL DEFAULT '0',
463
+  `bow` int(10) NOT NULL DEFAULT '0',
464
+  `pole` int(10) NOT NULL DEFAULT '0',
465
+  `dualWeapons` int(10) NOT NULL DEFAULT '0',
466
+  `bigSword` int(10) NOT NULL DEFAULT '0',
467
+  PRIMARY KEY (`charId`)
468
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
469
\ No newline at end of file
470
Index: dist/game/data/html/DressMe/Menu.htm
471
===================================================================
472
--- dist/game/data/html/DressMe/Menu.htm	(revision 0)
473
+++ dist/game/data/html/DressMe/Menu.htm	(working copy)
474
@@ -0,0 +1,11 @@
475
+<html>
476
+<body>
477
+<center>
478
+<button value="Copy Target" action="bypass -h .dressmetarget" width=80 height=27 back="L2UI_CT1.Button_DF_Down" fore="L2UI_ct1.button_df">
479
+<br1>
480
+%items%
481
+<br>
482
+%visualArmorState%
483
+</center>
484
+</body>
485
+</html>
486
\ No newline at end of file
487
Index: dist/game/data/scripts/handlers/voicedcommandhandlers/DressMe.java
488
===================================================================
489
--- dist/game/data/scripts/handlers/voicedcommandhandlers/DressMe.java	(revision 0)
490
+++ dist/game/data/scripts/handlers/voicedcommandhandlers/DressMe.java	(working copy)
491
@@ -0,0 +1,179 @@
492
+/*
493
+ * This program is free software: you can redistribute it and/or modify it under
494
+ * the terms of the GNU General Public License as published by the Free Software
495
+ * Foundation, either version 3 of the License, or (at your option) any later
496
+ * version.
497
+ * 
498
+ * This program is distributed in the hope that it will be useful, but WITHOUT
499
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
500
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
501
+ * details.
502
+ * 
503
+ * You should have received a copy of the GNU General Public License along with
504
+ * this program. If not, see <http://www.gnu.org/licenses/>.
505
+ */
506
+package handlers.voicedcommandhandlers;
507
+
508
+import com.l2jserver.gameserver.handler.IVoicedCommandHandler;
509
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
510
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance.VisualArmors;
511
+import com.l2jserver.gameserver.model.itemcontainer.Inventory;
512
+import com.l2jserver.gameserver.network.SystemMessageId;
513
+import com.l2jserver.gameserver.network.serverpackets.CharInfo;
514
+import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
515
+import com.l2jserver.gameserver.network.serverpackets.UserInfo;
516
+
517
+/**
518
+ * @author Erlandys
519
+ *
520
+ */
521
+public class DressMe implements IVoicedCommandHandler
522
+{
523
+	private static final String[] VOICED_COMMANDS =
524
+	{
525
+		"dressme", "dressmetarget", "dressmestate"
526
+	};
527
+	
528
+	@Override
529
+	public boolean useVoicedCommand(String command, L2PcInstance activeChar, String params)
530
+	{
531
+		if (command.equalsIgnoreCase("dressme")) {
532
+			NpcHtmlMessage html = new NpcHtmlMessage(0);
533
+			html.setFile(activeChar.getHtmlPrefix(), "data/html/DressMe/Menu.htm");
534
+			html.replace("%items%", showItems(activeChar));
535
+			html.replace("%visualArmorState%", "You are currently " + (activeChar.isUsingVisualArmors() ? "enabled" : "disabled") + " your Visual Armors! <a action=\"bypass -h .dressmestate\">Turn " + (activeChar.isUsingVisualArmors() ? "off" : "on") + " Visual Armors!</a>");
536
+			activeChar.sendPacket(html);
537
+		}
538
+		else if (command.equalsIgnoreCase("dressmetarget")) {
539
+			if (!(activeChar.getTarget() instanceof L2PcInstance) || activeChar.getTarget() == activeChar) {
540
+				activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
541
+				useVoicedCommand("dressme", activeChar, "");
542
+				return false;
543
+			}
544
+			L2PcInstance target = ((L2PcInstance) activeChar.getTarget());
545
+			if (target.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND) != null) {
546
+				switch (target.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND).getWeaponItem().getItemType()) {
547
+					case SWORD:
548
+					case BLUNT:
549
+					case DAGGER:
550
+					case ETC:
551
+					case FIST:
552
+					case RAPIER:
553
+						activeChar.setVisualArmor(VisualArmors.Sword, target.getVisualArmor(VisualArmors.RHand, false).getItemId());
554
+						break;
555
+					case BOW:
556
+					case CROSSBOW:
557
+						activeChar.setVisualArmor(VisualArmors.Bow, target.getVisualArmor(VisualArmors.RHand, false).getItemId());
558
+						break;
559
+					case POLE:
560
+						activeChar.setVisualArmor(VisualArmors.Pole, target.getVisualArmor(VisualArmors.RHand, false).getItemId());
561
+						break;
562
+					case DUAL:
563
+					case DUALFIST:
564
+					case DUALDAGGER:
565
+						activeChar.setVisualArmor(VisualArmors.Dual, target.getVisualArmor(VisualArmors.RHand, false).getItemId());
566
+						break;
567
+					case ANCIENTSWORD:
568
+					case BIGBLUNT:
569
+					case BIGSWORD:
570
+						activeChar.setVisualArmor(VisualArmors.BigSword, target.getVisualArmor(VisualArmors.RHand, false).getItemId());
571
+						break;
572
+				}
573
+			}
574
+			if (target.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND) != null && target.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LHAND).isArmor())
575
+				activeChar.setVisualArmor(VisualArmors.LHand, target.getVisualArmor(VisualArmors.LHand, false).getItemId());
576
+			if (target.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CHEST) != null)
577
+				activeChar.setVisualArmor(VisualArmors.Armor, target.getVisualArmor(VisualArmors.Armor, false).getItemId());
578
+			if (target.getInventory().getPaperdollItem(Inventory.PAPERDOLL_LEGS) != null && target.getVisualArmor(VisualArmors.Legs, false) != null)
579
+				activeChar.setVisualArmor(VisualArmors.Legs, target.getVisualArmor(VisualArmors.Legs, false).getItemId());
580
+			if (target.getInventory().getPaperdollItem(Inventory.PAPERDOLL_FEET) != null)
581
+				activeChar.setVisualArmor(VisualArmors.Feet, target.getVisualArmor(VisualArmors.Feet, false).getItemId());
582
+			if (target.getInventory().getPaperdollItem(Inventory.PAPERDOLL_GLOVES) != null)
583
+				activeChar.setVisualArmor(VisualArmors.Gloves, target.getVisualArmor(VisualArmors.Gloves, false).getItemId());
584
+			if (target.getInventory().getPaperdollItem(Inventory.PAPERDOLL_CLOAK) != null)
585
+				activeChar.setVisualArmor(VisualArmors.Cloak, target.getVisualArmor(VisualArmors.Cloak, false).getItemId());
586
+			activeChar.sendMessage("You have successfully copied " + target.getName() + "'s template!");
587
+			activeChar.sendPacket(new UserInfo(activeChar));
588
+			activeChar.sendPacket(new UserInfo(activeChar));
589
+			activeChar.broadcastPacket(new CharInfo(activeChar));
590
+			useVoicedCommand("dressme", activeChar, "");
591
+		}
592
+		else if (command.toLowerCase().startsWith("dressmestate")) {
593
+			boolean turnOn = !activeChar.isUsingVisualArmors();
594
+			activeChar.isUsingVisualArmors(turnOn);
595
+			activeChar.sendMessage("You have successfully " + (turnOn ? "enabled" : "disabled") + " Visual Armors!");
596
+			activeChar.sendPacket(new UserInfo(activeChar));
597
+			activeChar.sendPacket(new UserInfo(activeChar));
598
+			activeChar.broadcastPacket(new CharInfo(activeChar));
599
+			useVoicedCommand("dressme", activeChar, "");
600
+		}
601
+		return true;
602
+	}
603
+	
604
+	public String showItems(L2PcInstance activeChar) {
605
+		String items = "";
606
+		String sword = "icon.NOIMAGE";
607
+		if (activeChar.getVisualArmor(VisualArmors.Sword, true) != null)
608
+			sword = activeChar.getVisualArmor(VisualArmors.Sword, true).getIcon();
609
+		String bow = "icon.NOIMAGE";
610
+		if (activeChar.getVisualArmor(VisualArmors.Bow, true) != null)
611
+			bow = activeChar.getVisualArmor(VisualArmors.Bow, true).getIcon();
612
+		String pole = "icon.NOIMAGE";
613
+		if (activeChar.getVisualArmor(VisualArmors.Pole, true) != null)
614
+			pole = activeChar.getVisualArmor(VisualArmors.Pole, true).getIcon();
615
+		String dual = "icon.NOIMAGE";
616
+		if (activeChar.getVisualArmor(VisualArmors.Dual, true) != null)
617
+			dual = activeChar.getVisualArmor(VisualArmors.Dual, true).getIcon();
618
+		String bigSword = "icon.NOIMAGE";
619
+		if (activeChar.getVisualArmor(VisualArmors.BigSword, true) != null)
620
+			bigSword = activeChar.getVisualArmor(VisualArmors.BigSword, true).getIcon();
621
+		String cloak = "icon.NOIMAGE";
622
+		if (activeChar.getVisualArmor(VisualArmors.Cloak, true) != null)
623
+			cloak = activeChar.getVisualArmor(VisualArmors.Cloak, true).getIcon();
624
+		String armor = "icon.NOIMAGE";
625
+		if (activeChar.getVisualArmor(VisualArmors.Armor, true) != null)
626
+			armor = activeChar.getVisualArmor(VisualArmors.Armor, true).getIcon();
627
+		String lHand = "icon.NOIMAGE";
628
+		if (activeChar.getVisualArmor(VisualArmors.LHand, true) != null)
629
+			lHand = activeChar.getVisualArmor(VisualArmors.LHand, true).getIcon();
630
+		String legs = "icon.NOIMAGE";
631
+		if (activeChar.getVisualArmor(VisualArmors.Legs, true) != null)
632
+			legs = activeChar.getVisualArmor(VisualArmors.Legs, true).getIcon();
633
+		String feet = "icon.NOIMAGE";
634
+		if (activeChar.getVisualArmor(VisualArmors.Feet, true) != null)
635
+			feet = activeChar.getVisualArmor(VisualArmors.Feet, true).getIcon();
636
+		String gloves = "icon.NOIMAGE";
637
+		if (activeChar.getVisualArmor(VisualArmors.Gloves, true) != null)
638
+			gloves = activeChar.getVisualArmor(VisualArmors.Gloves, true).getIcon();
639
+		items += "<table width=200>" +
640
+			"<tr>" + 
641
+			"<td><img src=\"" + cloak + "\" width=32 height=32/></td>" +
642
+			"<td><img src=\"" + armor + "\" width=32 height=32/></td>" +
643
+			"<td><img src=\"" + lHand + "\" width=32 height=32/></td>" +
644
+			"</tr>" +
645
+			"<tr></tr><tr></tr>" +
646
+			"<tr>" + 
647
+			"<td><img src=\"" + gloves + "\" width=32 height=32/></td>" +
648
+			"<td><img src=\"" + legs + "\" width=32 height=32/></td>" +
649
+			"<td><img src=\"" + feet + "\" width=32 height=32/></td>" +
650
+			"</tr>" +
651
+			"</table>";
652
+		items += "<br><table width=250>" +
653
+			"<tr>" + 
654
+			"<td><img src=\"" + sword + "\" width=32 height=32/></td>" +
655
+			"<td><img src=\"" + bow + "\" width=32 height=32/></td>" +
656
+			"<td><img src=\"" + pole + "\" width=32 height=32/></td>" +
657
+			"<td><img src=\"" + dual + "\" width=32 height=32/></td>" +
658
+			"<td><img src=\"" + bigSword + "\" width=32 height=32/></td>" +
659
+			"</tr>" +
660
+			"</table>" +
661
+			"<br>";
662
+		return items;
663
+	}
664
+	
665
+	@Override
666
+	public String[] getVoicedCommandList()
667
+	{
668
+		return VOICED_COMMANDS;
669
+	}
670
+}