· 2 years ago · Jun 19, 2023, 05:50 PM
1el sql
2
3/*
4Navicat MySQL Data Transfer
5
6Source Server : localhost
7Source Server Version : 50740
8Source Host : localhost:3306
9Source Database : l2j
10
11Target Server Type : MYSQL
12Target Server Version : 50740
13File Encoding : 65001
14
15Date: 2023-06-19 14:40:34
16*/
17
18SET FOREIGN_KEY_CHECKS=0;
19
20-- ----------------------------
21-- Table structure for item_recover
22-- ----------------------------
23DROP TABLE IF EXISTS `item_recover`;
24CREATE TABLE `item_recover` (
25 `id` int(11) NOT NULL AUTO_INCREMENT,
26 `object_id` int(11) NOT NULL,
27 `item_id` int(11) NOT NULL,
28 `item_name` varchar(255) DEFAULT NULL,
29 `enchant_level` int(11) NOT NULL,
30 `item_type` varchar(255) DEFAULT NULL,
31 PRIMARY KEY (`id`),
32 KEY `object_id_index` (`object_id`)
33) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=latin1;
34
35
36
37### Eclipse Workspace Patch 1.0
38#P Orionwins
39diff --git src/Base/custom/RecoverableItem.java src/Base/custom/RecoverableItem.java
40new file mode 100644
41index 0000000..b360398
42--- /dev/null
43+++ src/Base/custom/RecoverableItem.java
44@@ -0,0 +1,111 @@
45+package Base.custom;
46+
47+import java.sql.Connection;
48+import java.sql.PreparedStatement;
49+import java.sql.SQLException;
50+
51+import l2jwins.game.datatables.sql.ItemTable;
52+import l2jwins.game.templates.L2Item;
53+import l2jwins.util.database.L2DatabaseFactory;
54+
55+public class RecoverableItem
56+{
57+ private int objectId;
58+ private int itemId;
59+ private String itemName;
60+ private int enchantLevel;
61+ private boolean selected; // New field for selection status
62+
63+ public RecoverableItem(int objectId, int itemId, String itemName, int enchantLevel)
64+ {
65+ this.objectId = objectId;
66+ this.itemId = itemId;
67+ this.itemName = itemName;
68+ this.enchantLevel = enchantLevel;
69+ this.selected = false; // Default selection status is false
70+ }
71+
72+ public int getObjectId()
73+ {
74+ return objectId;
75+ }
76+
77+ public int getItemId()
78+ {
79+ return itemId;
80+ }
81+
82+ public String getItemName()
83+ {
84+ return itemName;
85+ }
86+
87+ public int getEnchantLevel()
88+ {
89+ return enchantLevel;
90+ }
91+
92+ public void saveBrokenItemInfo()
93+ {
94+ Connection con = null;
95+ PreparedStatement statement = null;
96+
97+ try
98+ {
99+ con = L2DatabaseFactory.getInstance().getConnection();
100+ String sql = "INSERT INTO item_recover (object_id, item_id, item_name, enchant_level) VALUES (?, ?, ?, ?)";
101+ statement = con.prepareStatement(sql);
102+ statement.setInt(1, objectId);
103+ statement.setInt(2, itemId);
104+ statement.setString(3, itemName);
105+ statement.setInt(4, enchantLevel);
106+ statement.execute();
107+ }
108+ catch (SQLException e)
109+ {
110+ // Manejo de excepciones en caso de error al guardar en la base de datos
111+ e.printStackTrace();
112+ }
113+ finally
114+ {
115+ // Cierra la conexión y el statement
116+ try
117+ {
118+ if (statement != null)
119+ {
120+ statement.close();
121+ }
122+ if (con != null)
123+ {
124+ con.close();
125+ }
126+ }
127+ catch (SQLException e)
128+ {
129+ // Manejo de excepciones en caso de error al cerrar la conexión
130+ e.printStackTrace();
131+ }
132+ }
133+ }
134+
135+ public boolean isSelected()
136+ {
137+ return selected;
138+ }
139+
140+ public void setSelected(boolean selected)
141+ {
142+ this.selected = selected;
143+ }
144+
145+ public String getIcon()
146+ {
147+ return getItem().getIcon();
148+ }
149+
150+ public L2Item getItem()
151+ {
152+ return ItemTable.getInstance().getTemplate(itemId);
153+ }
154+
155+}
156diff --git src/l2jwins/Config.java src/l2jwins/Config.java
157index 8f197fb..5624a2d 100644
158--- src/l2jwins/Config.java
159+++ src/l2jwins/Config.java
160@@ -282,6 +282,8 @@
161 public static boolean SPECIAL_COUPON_ITEMS;
162 public static boolean PLAYER_STATS_ENABLE;
163
164+ public static int BLACK_COUPON_ID;
165+
166 // ===================================================================================================================================//
167
168 public static void loadExtraSettingsConfig()
169@@ -305,6 +307,8 @@
170
171 AFK_TIMER = Integer.parseInt(ExtraSettings.getProperty("TimerAFK", "10"));
172
173+ BLACK_COUPON_ID = Integer.parseInt(ExtraSettings.getProperty("BlackCouponId", "6392"));
174+
175 CLAN_BUFF_ID = Integer.parseInt(ExtraSettings.getProperty("ClanBuffId", "1388"));
176
177 HERO_5_DAYS_COUNT = Integer.parseInt(ExtraSettings.getProperty("Hero5DaysCount", "30"));
178diff --git src/l2jwins/game/handler/ItemHandler.java src/l2jwins/game/handler/ItemHandler.java
179index 109b140..2d94fa9 100644
180--- src/l2jwins/game/handler/ItemHandler.java
181+++ src/l2jwins/game/handler/ItemHandler.java
182@@ -37,6 +37,7 @@
183 import l2jwins.game.handler.item.HeroCustom365DaysItem;
184 import l2jwins.game.handler.item.HeroCustom7DaysItem;
185 import l2jwins.game.handler.item.HsItems;
186+import l2jwins.game.handler.item.Item_Recover;
187 import l2jwins.game.handler.item.JackpotSeed;
188 import l2jwins.game.handler.item.MOSKey;
189 import l2jwins.game.handler.item.MagicGem;
190@@ -142,6 +143,7 @@
191 registerItemHandler(new ClanReputationItem());
192 registerItemHandler(new MagicGem());
193 registerItemHandler(new DungeonReset());
194+ registerItemHandler(new Item_Recover());
195
196 LOG.info("ItemHandler: Loaded " + _datatable.size() + " handlers");
197 }
198diff --git src/l2jwins/game/handler/item/Item_Recover.java src/l2jwins/game/handler/item/Item_Recover.java
199new file mode 100644
200index 0000000..48aabf7
201--- /dev/null
202+++ src/l2jwins/game/handler/item/Item_Recover.java
203@@ -0,0 +1,170 @@
204+package l2jwins.game.handler.item;
205+
206+import java.sql.Connection;
207+import java.sql.PreparedStatement;
208+import java.sql.ResultSet;
209+import java.sql.SQLException;
210+import java.util.ArrayList;
211+import java.util.List;
212+
213+import Base.custom.RecoverableItem;
214+import l2jwins.Config;
215+import l2jwins.game.handler.IItemHandler;
216+import l2jwins.game.model.actor.instance.L2ItemInstance;
217+import l2jwins.game.model.actor.instance.L2PcInstance;
218+import l2jwins.game.model.actor.instance.L2PlayableInstance;
219+import l2jwins.game.network.serverpackets.ActionFailed;
220+import l2jwins.game.network.serverpackets.NpcHtmlMessage;
221+import l2jwins.util.database.L2DatabaseFactory;
222+
223+/**
224+ * @author Terius
225+ */
226+public class Item_Recover implements IItemHandler
227+{
228+ private static final int[] ITEM_IDS = new int[]
229+ {
230+ Config.BLACK_COUPON_ID
231+ };
232+
233+ @Override
234+ public void useItem(L2PlayableInstance playable, L2ItemInstance item)
235+ {
236+ if (!(playable instanceof L2PcInstance))
237+ {
238+ return;
239+ }
240+
241+ L2PcInstance activeChar = (L2PcInstance) playable;
242+
243+ // Abre la ventana de recuperación y muestra los últimos 10 items recuperables
244+ openRecoveryWindow(activeChar);
245+ }
246+
247+ private static void openRecoveryWindow(L2PcInstance player)
248+ {
249+ // Obtén los últimos 10 items recuperables de la base de datos para el object_id del jugador
250+ List<RecoverableItem> recoverableItems = getRecoverableItems(player.getObjectId());
251+
252+ // Verifica si hay items recuperables
253+ if (recoverableItems.isEmpty())
254+ {
255+ // No hay items recuperables, muestra un mensaje al jugador
256+ player.sendMessage("No hay items recuperables disponibles.");
257+ return;
258+ }
259+
260+ // Crea una instancia de NpcHtmlMessage para mostrar la ventana
261+ NpcHtmlMessage html = new NpcHtmlMessage(1);
262+
263+ // Genera el contenido HTML de la ventana con la lista de los últimos 10 items recuperables
264+ String content = generateRecoveryList(recoverableItems);
265+ html.setHtml(content);
266+
267+ // Envía la ventana al jugador
268+ player.sendPacket(html);
269+ player.sendPacket(ActionFailed.STATIC_PACKET);
270+ }
271+
272+ @Override
273+ public int[] getItemIds()
274+ {
275+ return ITEM_IDS;
276+ }
277+
278+ private static String generateRecoveryList(List<RecoverableItem> recoverableItems)
279+ {
280+ // Genera el contenido HTML de la ventana con la lista de los últimos 10 items recuperables
281+ StringBuilder sb = new StringBuilder();
282+ sb.append("<html><body><center><font color=\"LEVEL\">Item Recuperables</font><br><br>");
283+
284+ // Mensaje de advertencia sobre la recuperación de solo 1 item a la vez
285+ sb.append("<font color=\"FF0000\">Solo puedes recuperar 1 item a la vez.</font><br>");
286+
287+ // Inicia la tabla
288+ sb.append("<table>");
289+
290+ // Itera sobre los items recuperables
291+ for (RecoverableItem item : recoverableItems)
292+ {
293+ sb.append("<tr>");
294+ sb.append("<td>");
295+ sb.append("<img src=\"").append(item.getIcon()).append("\" width=32 height=32>");
296+ sb.append("</td>");
297+ sb.append("<td><font color=\"FFFFFF\">").append(item.getItemName()).append("</font>");
298+
299+ int enchantLevel = item.getEnchantLevel();
300+ if (enchantLevel > 0)
301+ {
302+ sb.append(" <font color=\"00FF00\">+").append(enchantLevel).append("</font>");
303+ }
304+
305+ sb.append("</td>");
306+
307+ int itemId = item.getItemId();
308+ sb.append("<td><button value=\"Recuperar\" action=\"bypass -h recoverSelectedItem ").append(itemId).append(" ").append(enchantLevel).append("\" width=75 height=21 back=\"L2UI.DefaultButton_click\" fore=\"L2UI.DefaultButton\"></td>");
309+
310+ sb.append("</tr>");
311+ }
312+
313+ // Cierra la tabla
314+ sb.append("</table>");
315+
316+ sb.append("</center></body></html>");
317+ return sb.toString();
318+ }
319+
320+ private static List<RecoverableItem> getRecoverableItems(int objectId)
321+ {
322+ List<RecoverableItem> recoverableItems = new ArrayList<>();
323+ Connection con = null;
324+ PreparedStatement statement = null;
325+ ResultSet resultSet = null;
326+
327+ try
328+ {
329+ con = L2DatabaseFactory.getInstance().getConnection();
330+ String sql = "SELECT item_id, item_name, enchant_level FROM item_recover WHERE object_id = ? ORDER BY id DESC LIMIT 10";
331+ statement = con.prepareStatement(sql);
332+ statement.setInt(1, objectId);
333+ resultSet = statement.executeQuery();
334+
335+ while (resultSet.next())
336+ {
337+ int itemId = resultSet.getInt("item_id");
338+ String itemName = resultSet.getString("item_name");
339+ int enchantLevel = resultSet.getInt("enchant_level");
340+
341+ RecoverableItem item = new RecoverableItem(objectId, itemId, itemName, enchantLevel);
342+ recoverableItems.add(item);
343+ }
344+ }
345+ catch (SQLException e)
346+ {
347+ // Manejo de excepciones en caso de error al obtener los items recuperables de la base de datos
348+ e.printStackTrace();
349+ }
350+ finally
351+ {
352+ try
353+ {
354+ if (resultSet != null)
355+ {
356+ resultSet.close();
357+ }
358+ if (statement != null)
359+ {
360+ statement.close();
361+ }
362+ if (con != null)
363+ {
364+ con.close();
365+ }
366+ }
367+ catch (SQLException e)
368+ {
369+ // Manejo de excepciones en caso de error al cerrar la conexión a la base de datos
370+ e.printStackTrace();
371+ }
372+ }
373+
374+ return recoverableItems;
375+ }
376+}
377diff --git src/l2jwins/game/network/clientpackets/RequestBypassToServer.java src/l2jwins/game/network/clientpackets/RequestBypassToServer.java
378index e07bb3e..8467818 100644
379--- src/l2jwins/game/network/clientpackets/RequestBypassToServer.java
380+++ src/l2jwins/game/network/clientpackets/RequestBypassToServer.java
381@@ -78,6 +78,7 @@
382 import l2jwins.game.network.SystemMessageId;
383 import l2jwins.game.network.serverpackets.ActionFailed;
384 import l2jwins.game.network.serverpackets.ExShowScreenMessage;
385+import l2jwins.game.network.serverpackets.ItemList;
386 import l2jwins.game.network.serverpackets.NpcHtmlMessage;
387 import l2jwins.game.network.serverpackets.OpenUrl;
388 import l2jwins.game.network.serverpackets.PlaySound;
389@@ -883,6 +884,18 @@
390 L2PcInstance player = getClient().getActiveChar();
391 CustomBypassHandler.getInstance().handleBypass(player, bp.bypass);
392 }
393+
394+ else if (bp.bypass.startsWith("recoverSelectedItem"))
395+ {
396+ String[] bypassParts = bp.bypass.split(" ");
397+ if (bypassParts.length >= 3)
398+ {
399+ int itemId = Integer.parseInt(bypassParts[1]);
400+ int enchantLevel = Integer.parseInt(bypassParts[2]);
401+ recoverSelectedItem(activeChar, itemId, enchantLevel);
402+ }
403+ }
404+
405 else if (bp.bypass.startsWith("arenachange")) // change
406 {
407 final boolean isManager = activeChar.getTarget() != null && activeChar.getTarget() instanceof L2OlympiadManagerInstance;
408@@ -1931,6 +1944,83 @@
409 return 0;
410 }
411
412+ private static void recoverSelectedItem(L2PcInstance player, int itemId, int enchantLevel)
413+ {
414+ // Comprueba si el jugador tiene suficientes items del ID 6392
415+ L2ItemInstance recoveryItem = player.getInventory().getItemByItemId(6392);
416+ if (recoveryItem == null || recoveryItem.getCount() < 1)
417+ {
418+ player.sendMessage("No tienes suficientes items para recuperar este item.");
419+ return;
420+ }
421+
422+ // Crea el item a recuperar con el ID y enchantLevel proporcionados
423+ L2ItemInstance recoveredItem = ItemTable.getInstance().createItem("RecoverItem", itemId, 1, player);
424+ recoveredItem.setEnchantLevel(enchantLevel);
425+
426+ // Agrega el item recuperado al inventario del jugador
427+ player.getInventory().addItem("RecoverItem", recoveredItem, player, player);
428+
429+ // Cobra 1 item del ID 6392
430+ player.getInventory().destroyItemByItemId("RecoveryCost", Config.BLACK_COUPON_ID, 1, player, player);
431+
432+ // Elimina el item recuperado de la base de datos
433+ removeRecoverableItem(itemId, player.getObjectId());
434+
435+ // Actualiza el inventario del jugador para que aparezca el item recuperado
436+ player.sendPacket(new ItemList(player, true));
437+
438+ // Envía un mensaje al jugador con el nombre del item y su nivel de enchant
439+ String itemName = recoveredItem.getItemName();
440+ String message = "Has recuperado el item " + itemName;
441+ if (enchantLevel > 0)
442+ {
443+ message += " +" + enchantLevel;
444+ }
445+ player.sendMessage(message);
446+
447+ }
448+
449+ private static void removeRecoverableItem(int itemId, int objectId)
450+ {
451+ Connection con = null;
452+ PreparedStatement statement = null;
453+
454+ try
455+ {
456+ con = L2DatabaseFactory.getInstance().getConnection();
457+ String sql = "DELETE FROM item_recover WHERE item_id = ? AND object_id = ?";
458+ statement = con.prepareStatement(sql);
459+ statement.setInt(1, itemId);
460+ statement.setInt(2, objectId);
461+ statement.executeUpdate();
462+ }
463+ catch (SQLException e)
464+ {
465+ // Manejo de excepciones en caso de error al eliminar el item recuperable de la base de datos
466+ e.printStackTrace();
467+ }
468+ finally
469+ {
470+ try
471+ {
472+ if (statement != null)
473+ {
474+ statement.close();
475+ }
476+ if (con != null)
477+ {
478+ con.close();
479+ }
480+ }
481+ catch (SQLException e)
482+ {
483+ // Manejo de excepciones en caso de error al cerrar la conexión a la base de datos
484+ e.printStackTrace();
485+ }
486+ }
487+ }
488+
489 public static void applyStatPointsStr(L2PcInstance player)
490 {
491 Lambda lambda = new Lambda()
492diff --git src/l2jwins/game/network/clientpackets/RequestEnchantItem.java src/l2jwins/game/network/clientpackets/RequestEnchantItem.java
493index 4d74768..d1dfb37 100644
494--- src/l2jwins/game/network/clientpackets/RequestEnchantItem.java
495+++ src/l2jwins/game/network/clientpackets/RequestEnchantItem.java
496@@ -17,6 +17,10 @@
497 */
498 package l2jwins.game.network.clientpackets;
499
500+import java.sql.Connection;
501+import java.sql.PreparedStatement;
502+import java.sql.SQLException;
503+
504 import l2jwins.Config;
505 import l2jwins.game.datatables.xml.AugmentationData;
506 import l2jwins.game.datatables.xml.AugmentationScrollData;
507@@ -43,6 +47,7 @@
508 import l2jwins.game.util.Util;
509 import l2jwins.logger.Logger;
510 import l2jwins.logger.LoggerFactory;
511+import l2jwins.util.database.L2DatabaseFactory;
512 import l2jwins.util.random.Rnd;
513
514 public final class RequestEnchantItem extends PacketClient
515@@ -826,6 +831,10 @@
516 activeChar.sendPacket(sm);
517 }
518 activeChar.getAchievement().increase(AchType.ENCHANT_FAILED);
519+
520+ // Agrega el código para guardar la información del item roto en la tabla de la base de datos
521+ saveBrokenItemInfo(activeChar.getObjectId(), item.getItemId(), item.getItemName(), item.getEnchantLevel(), item.getItem().getItemType().name());
522+
523 }
524
525 if (!blessedScroll && !crystalScroll)
526@@ -1077,6 +1086,50 @@
527 }
528 }
529
530+ private void saveBrokenItemInfo(int objectId, int itemId, String itemName, int enchantLevel, String itemType)
531+ {
532+ Connection con = null;
533+ PreparedStatement statement = null;
534+
535+ try
536+ {
537+ con = L2DatabaseFactory.getInstance().getConnection();
538+ String sql = "INSERT INTO item_recover (object_id, item_id, item_name, enchant_level, item_type) VALUES (?, ?, ?, ?, ?)";
539+ statement = con.prepareStatement(sql);
540+ statement.setInt(1, objectId);
541+ statement.setInt(2, itemId);
542+ statement.setString(3, itemName);
543+ statement.setInt(4, enchantLevel);
544+ statement.setString(5, itemType);
545+ statement.execute();
546+ }
547+ catch (SQLException e)
548+ {
549+ // Manejo de excepciones en caso de error al guardar en la base de datos
550+ e.printStackTrace();
551+ }
552+ finally
553+ {
554+ // Cierra la conexión y el statement
555+ try
556+ {
557+ if (statement != null)
558+ {
559+ statement.close();
560+ }
561+ if (con != null)
562+ {
563+ con.close();
564+ }
565+ }
566+ catch (SQLException e)
567+ {
568+ // Manejo de excepciones en caso de error al cerrar la conexión
569+ e.printStackTrace();
570+ }
571+ }
572+ }
573+
574 @Override
575 public String getType()
576 {
577