Advertisement
tensador125

Random Craft Acis 405

Jun 22nd, 2023 (edited)
3,310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 30.85 KB | Gaming | 0 0
  1. ### Eclipse Workspace Patch 1.0
  2. #P aCis_gameserver405
  3. diff --git config/players.properties config/players.properties
  4. index 99e7087..863c6c5 100644
  5. --- config/players.properties
  6. +++ config/players.properties
  7. @@ -259,6 +259,22 @@
  8.  # Store buffs/debuffs on user logout. Default: True
  9.  StoreSkillCooltime = True
  10.  
  11. +
  12. +
  13. +#==========================================================================
  14. +#   RANDOM CRAFT SYSTEM NPC - ID - CONSUME - REFRESH - CREATE - ITEMS
  15. +#==========================================================================
  16. +
  17. +RandomCraftItemId = 57
  18. +
  19. +RandomCraftConsumeRefresh = 50000
  20. +
  21. +RandromCraftConsumeCreate = 300000
  22. +
  23. +
  24. +
  25. +
  26. +
  27.  # DressMe system.
  28.  AllowDressMeSystem = True
  29.  
  30. diff --git java/Base/Data/IconTable.java java/Base/Data/IconTable.java
  31. new file mode 100644
  32. index 0000000..fdce5d7
  33. --- /dev/null
  34. +++ java/Base/Data/IconTable.java
  35. @@ -0,0 +1,62 @@
  36. +package Base.Data;
  37. +
  38. +import java.io.File;
  39. +import java.util.HashMap;
  40. +import java.util.Map;
  41. +
  42. +import org.w3c.dom.Document;
  43. +import org.w3c.dom.NamedNodeMap;
  44. +import org.w3c.dom.Node;
  45. +
  46. +public class IconTable extends XMLDocument
  47. +{
  48. +   private static final Map<Integer, String> itemIcons = new HashMap<>();
  49. +  
  50. +   public IconTable()
  51. +   {
  52. +       load();
  53. +   }
  54. +  
  55. +   @Override
  56. +   protected void load()
  57. +   {
  58. +       loadDocument("./data/xml/icons.xml");
  59. +       LOG.info("Loaded " + itemIcons.size() + " icons.");
  60. +   }
  61. +  
  62. +   @Override
  63. +   protected void parseDocument(Document doc, File f)
  64. +   {
  65. +       // First element is never read.
  66. +       final Node n = doc.getFirstChild();
  67. +      
  68. +       for (Node o = n.getFirstChild(); o != null; o = o.getNextSibling())
  69. +       {
  70. +           if (!"icon".equalsIgnoreCase(o.getNodeName()))
  71. +           {
  72. +               continue;
  73. +           }
  74. +          
  75. +           final NamedNodeMap attrs = o.getAttributes();
  76. +           final int itemId = Integer.valueOf(attrs.getNamedItem("Id").getNodeValue());
  77. +           final String value = String.valueOf(attrs.getNamedItem("value").getNodeValue());
  78. +          
  79. +           itemIcons.put(itemId, value);
  80. +       }
  81. +   }
  82. +  
  83. +   public String getIcon(int id)
  84. +   {
  85. +       return itemIcons.get(id) == null ? "icon.noimage" : itemIcons.get(id);
  86. +   }
  87. +  
  88. +   public static IconTable getInstance()
  89. +   {
  90. +       return SingletonHolder._instance;
  91. +   }
  92. +  
  93. +   private static class SingletonHolder
  94. +   {
  95. +       protected static final IconTable _instance = new IconTable();
  96. +   }
  97. +}
  98. diff --git java/Base/Data/XMLDocument.java java/Base/Data/XMLDocument.java
  99. new file mode 100644
  100. index 0000000..7ba3079
  101. --- /dev/null
  102. +++ java/Base/Data/XMLDocument.java
  103. @@ -0,0 +1,119 @@
  104. +package Base.Data;
  105. +
  106. +import java.io.File;
  107. +import java.util.logging.Level;
  108. +import java.util.logging.Logger;
  109. +
  110. +import javax.xml.parsers.DocumentBuilderFactory;
  111. +import javax.xml.transform.OutputKeys;
  112. +import javax.xml.transform.Transformer;
  113. +import javax.xml.transform.TransformerException;
  114. +import javax.xml.transform.TransformerFactory;
  115. +import javax.xml.transform.dom.DOMSource;
  116. +import javax.xml.transform.stream.StreamResult;
  117. +
  118. +import net.sf.l2j.commons.data.StatSet;
  119. +
  120. +import org.w3c.dom.Document;
  121. +import org.w3c.dom.NamedNodeMap;
  122. +import org.w3c.dom.Node;
  123. +
  124. +/**
  125. + * An XML document, relying on a static and single DocumentBuilderFactory.
  126. + */
  127. +public abstract class XMLDocument
  128. +{
  129. +   protected static final Logger LOG = Logger.getLogger(XMLDocument.class.getName());
  130. +  
  131. +   protected Document document;
  132. +  
  133. +   private static final DocumentBuilderFactory BUILDER;
  134. +   static
  135. +   {
  136. +       BUILDER = DocumentBuilderFactory.newInstance();
  137. +       BUILDER.setValidating(false);
  138. +       BUILDER.setIgnoringComments(true);
  139. +   }
  140. +  
  141. +   abstract protected void load();
  142. +  
  143. +   abstract protected void parseDocument(Document doc, File f);
  144. +  
  145. +   public void loadDocument(String filePath)
  146. +   {
  147. +       loadDocument(new File(filePath));
  148. +   }
  149. +  
  150. +   public void writeDocument(Document doc, String fileName)
  151. +   {
  152. +       try
  153. +       {
  154. +           TransformerFactory transformerFactory = TransformerFactory.newInstance();
  155. +           Transformer transformer = transformerFactory.newTransformer();
  156. +           transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
  157. +           transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  158. +           transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
  159. +          
  160. +           DOMSource source = new DOMSource(doc);
  161. +           StreamResult result = new StreamResult(new File(fileName));
  162. +          
  163. +           transformer.transform(source, result);
  164. +           LOG.info("XML file saved to " + fileName);
  165. +       }
  166. +       catch (TransformerException e)
  167. +       {
  168. +           LOG.warning("Error saving XML file: " + e.getMessage());
  169. +       }
  170. +   }
  171. +  
  172. +   /**
  173. +    * Parse an entire directory or file if found.
  174. +    * @param file
  175. +    */
  176. +   public void loadDocument(File file)
  177. +   {
  178. +       if (!file.exists())
  179. +       {
  180. +           LOG.severe("The following file or directory doesn't exist: " + file.getName());
  181. +           return;
  182. +       }
  183. +      
  184. +       if (file.isDirectory())
  185. +       {
  186. +           for (File f : file.listFiles())
  187. +           {
  188. +               loadDocument(f);
  189. +           }
  190. +       }
  191. +       else if (file.isFile())
  192. +       {
  193. +           try
  194. +           {
  195. +               parseDocument(BUILDER.newDocumentBuilder().parse(file), file);
  196. +           }
  197. +           catch (Exception e)
  198. +           {
  199. +               LOG.log(Level.SEVERE, "Error loading XML file " + file.getName(), e);
  200. +           }
  201. +       }
  202. +   }
  203. +  
  204. +   public Document getDocument()
  205. +   {
  206. +       return document;
  207. +   }
  208. +  
  209. +   /**
  210. +    * This method parses the content of a NamedNodeMap and feed the given StatsSet.
  211. +    * @param attrs : The NamedNodeMap to parse.
  212. +    * @param set : The StatsSet to feed.
  213. +    */
  214. +   public static void parseAndFeed(NamedNodeMap attrs, StatSet set)
  215. +   {
  216. +       for (int i = 0; i < attrs.getLength(); i++)
  217. +       {
  218. +           final Node attr = attrs.item(i);
  219. +           set.set(attr.getNodeName(), attr.getNodeValue());
  220. +       }
  221. +   }
  222. +}
  223. diff --git java/Base/RandomCraft/RandomCraftItem.java java/Base/RandomCraft/RandomCraftItem.java
  224. new file mode 100644
  225. index 0000000..088d66f
  226. --- /dev/null
  227. +++ java/Base/RandomCraft/RandomCraftItem.java
  228. @@ -0,0 +1,50 @@
  229. +package Base.RandomCraft;
  230. +
  231. +import net.sf.l2j.gameserver.data.xml.ItemData;
  232. +import net.sf.l2j.gameserver.model.item.kind.Item;
  233. +
  234. +public class RandomCraftItem
  235. +{
  236. +   private int id;
  237. +   private int cantidad;
  238. +   private double probabilidad;
  239. +   private boolean announce;
  240. +  
  241. +   public RandomCraftItem(int id, int cantidad, double probabilidad, boolean announce)
  242. +   {
  243. +       this.id = id;
  244. +       this.cantidad = cantidad;
  245. +       this.probabilidad = probabilidad;
  246. +       this.announce = announce;
  247. +   }
  248. +  
  249. +   public int getId()
  250. +   {
  251. +       return id;
  252. +   }
  253. +  
  254. +   public int getCantidad()
  255. +   {
  256. +       return cantidad;
  257. +   }
  258. +  
  259. +   public double getProbabilidad()
  260. +   {
  261. +       return probabilidad;
  262. +   }
  263. +  
  264. +   public boolean getAnnounce()
  265. +   {
  266. +       return announce;
  267. +   }
  268. +  
  269. +   public String getIcon()
  270. +   {
  271. +       return getItem().getIcon();
  272. +   }
  273. +  
  274. +   public Item getItem()
  275. +   {
  276. +       return ItemData.getInstance().getTemplate(id);
  277. +   }
  278. +}
  279. diff --git java/Base/RandomCraft/RandomCraftXML.java java/Base/RandomCraft/RandomCraftXML.java
  280. new file mode 100644
  281. index 0000000..0f2672d
  282. --- /dev/null
  283. +++ java/Base/RandomCraft/RandomCraftXML.java
  284. @@ -0,0 +1,80 @@
  285. +package Base.RandomCraft;
  286. +
  287. +import java.io.File;
  288. +import java.util.HashMap;
  289. +import java.util.Map;
  290. +
  291. +import org.w3c.dom.Document;
  292. +import org.w3c.dom.NamedNodeMap;
  293. +import org.w3c.dom.Node;
  294. +
  295. +import Base.Data.XMLDocument;
  296. +
  297. +public class RandomCraftXML extends XMLDocument
  298. +{
  299. +   private Map<Integer, RandomCraftItem> items;
  300. +  
  301. +   public RandomCraftXML()
  302. +   {
  303. +       items = new HashMap<>();
  304. +       load();
  305. +   }
  306. +  
  307. +   public static RandomCraftXML getInstance()
  308. +   {
  309. +       return SingletonHolder.INSTANCE;
  310. +   }
  311. +  
  312. +   private static class SingletonHolder
  313. +   {
  314. +       protected static final RandomCraftXML INSTANCE = new RandomCraftXML();
  315. +   }
  316. +  
  317. +   @Override
  318. +   protected void load()
  319. +   {
  320. +       loadDocument("./data/xml/RandomCraft.xml");
  321. +       LOG.info("RandomCraftItemData: Loaded " + items.size() + " items.");
  322. +   }
  323. +  
  324. +   @Override
  325. +   protected void parseDocument(Document doc, File file)
  326. +   {
  327. +       try
  328. +       {
  329. +           final Node root = doc.getFirstChild();
  330. +          
  331. +           for (Node node = root.getFirstChild(); node != null; node = node.getNextSibling())
  332. +           {
  333. +               if (!"item".equalsIgnoreCase(node.getNodeName()))
  334. +               {
  335. +                   continue;
  336. +               }
  337. +              
  338. +               NamedNodeMap attrs = node.getAttributes();
  339. +               int id = Integer.parseInt(attrs.getNamedItem("id").getNodeValue());
  340. +               int cantidad = Integer.parseInt(attrs.getNamedItem("count").getNodeValue());
  341. +               double probabilidad = Double.parseDouble(attrs.getNamedItem("chance").getNodeValue());
  342. +               boolean announce = Boolean.parseBoolean(attrs.getNamedItem("announce").getNodeValue());
  343. +              
  344. +               RandomCraftItem item = new RandomCraftItem(id, cantidad, probabilidad, announce);
  345. +               items.put(id, item);
  346. +           }
  347. +       }
  348. +       catch (Exception e)
  349. +       {
  350. +           // LOG.warning("RandomCraftItemData: Error while loading items: " + e);
  351. +           e.printStackTrace();
  352. +       }
  353. +   }
  354. +  
  355. +   public Map<Integer, RandomCraftItem> getItems()
  356. +   {
  357. +       return items;
  358. +   }
  359. +  
  360. +   public RandomCraftItem getItemById(int id)
  361. +   {
  362. +       return items.get(id);
  363. +   }
  364. +}
  365. diff --git java/net/sf/l2j/Config.java java/net/sf/l2j/Config.java
  366. index a0fde2e..30397a1 100644
  367. --- java/net/sf/l2j/Config.java
  368. +++ java/net/sf/l2j/Config.java
  369. @@ -49,6 +49,16 @@
  370.     // Clans settings
  371.     // --------------------------------------------------
  372.    
  373. +          
  374. +          
  375. +   public static int RANDOM_CRAFT_ITEM_ID_CONSUME;
  376. +   public static int RANDOM_CRAFT_ITEM_CONSUME_REFRESH;
  377. +   public static int RANDOM_CRAFT_ITEM_CONSUME_CREATE;        
  378. +          
  379. +          
  380. +          
  381. +          
  382. +          
  383.     /** Clans */
  384.     public static int CLAN_JOIN_DAYS;
  385.     public static int CLAN_CREATE_DAYS;
  386. @@ -963,6 +973,13 @@
  387.         HP_REGEN_MULTIPLIER = players.getProperty("HpRegenMultiplier", 1.);
  388.         MP_REGEN_MULTIPLIER = players.getProperty("MpRegenMultiplier", 1.);
  389.         CP_REGEN_MULTIPLIER = players.getProperty("CpRegenMultiplier", 1.);
  390. +      
  391. +       RANDOM_CRAFT_ITEM_ID_CONSUME = players.getProperty("RandomCraftItemId", 57);
  392. +      
  393. +       RANDOM_CRAFT_ITEM_CONSUME_REFRESH = players.getProperty("RandomCraftConsumeRefresh", 50000);
  394. +      
  395. +       RANDOM_CRAFT_ITEM_CONSUME_CREATE = players.getProperty("RandromCraftConsumeCreate", 300000);
  396. +          
  397.         PLAYER_SPAWN_PROTECTION = players.getProperty("PlayerSpawnProtection", 0);
  398.         PLAYER_FAKEDEATH_UP_PROTECTION = players.getProperty("PlayerFakeDeathUpProtection", 5);
  399.         RESPAWN_RESTORE_HP = players.getProperty("RespawnRestoreHP", 0.7);
  400. diff --git java/net/sf/l2j/gameserver/GameServer.java java/net/sf/l2j/gameserver/GameServer.java
  401. index 29763e0..e7cc44c 100644
  402. --- java/net/sf/l2j/gameserver/GameServer.java
  403. +++ java/net/sf/l2j/gameserver/GameServer.java
  404. @@ -102,6 +102,8 @@
  405.  import net.sf.l2j.util.DeadLockDetector;
  406.  import net.sf.l2j.util.IPv4Filter;
  407.  
  408. +import Base.Data.IconTable;
  409. +import Base.RandomCraft.RandomCraftXML;
  410.  import Base.Skin.DressMeData;
  411.  
  412.  public class GameServer
  413. @@ -266,6 +268,11 @@
  414.         StringUtil.printSection("Spawns");
  415.         SpawnManager.getInstance().spawn();
  416.        
  417. +       IconTable.getInstance();
  418. +      
  419. +       StringUtil.printSection("RandomCraft - Terius");
  420. +       RandomCraftXML.getInstance();      
  421. +      
  422.         StringUtil.printSection("Handlers");
  423.         LOGGER.info("Loaded {} admin command handlers.", AdminCommandHandler.getInstance().size());
  424.         LOGGER.info("Loaded {} chat handlers.", ChatHandler.getInstance().size());
  425. diff --git java/net/sf/l2j/gameserver/model/actor/Player.java java/net/sf/l2j/gameserver/model/actor/Player.java
  426. index 8610748..35bca86 100644
  427. --- java/net/sf/l2j/gameserver/model/actor/Player.java
  428. +++ java/net/sf/l2j/gameserver/model/actor/Player.java
  429. @@ -228,6 +228,7 @@
  430.  import net.sf.l2j.gameserver.taskmanager.ShadowItemTaskManager;
  431.  import net.sf.l2j.gameserver.taskmanager.WaterTaskManager;
  432.  
  433. +import Base.RandomCraft.RandomCraftItem;
  434.  import Base.Skin.DressMeData;
  435.  
  436.  /**
  437. @@ -319,6 +320,8 @@
  438.     protected int _activeClass;
  439.     protected int _classIndex;
  440.    
  441. +   private List<RandomCraftItem> generatedCraftItems; 
  442. +  
  443.     private final Map<Integer, SubClass> _subClasses = new ConcurrentSkipListMap<>();
  444.     private final ReentrantLock _subclassLock = new ReentrantLock();
  445.    
  446. @@ -7368,6 +7371,8 @@
  447.         return false;
  448.     }
  449.    
  450. +  
  451. +
  452.     @Override
  453.     public void unpolymorph()
  454.     {
  455. @@ -7375,6 +7380,25 @@
  456.         sendPacket(new UserInfo(this));
  457.     }
  458.    
  459. +  
  460. +   public List<RandomCraftItem> getGeneratedCraftItems()
  461. +   {
  462. +       return generatedCraftItems;
  463. +   }
  464. +  
  465. +   public void setGeneratedCraftItems(List<RandomCraftItem> items)
  466. +   {
  467. +       generatedCraftItems = items;
  468. +   }
  469. +  
  470. +   public void clearGeneratedCraftItems()
  471. +   {
  472. +       generatedCraftItems.clear();
  473. +   }  
  474. +  
  475. +  
  476. +  
  477. +  
  478.     @Override
  479.     public void addKnownObject(WorldObject object)
  480.     {
  481. diff --git java/net/sf/l2j/gameserver/model/actor/instance/RandomCraft.java java/net/sf/l2j/gameserver/model/actor/instance/RandomCraft.java
  482. new file mode 100644
  483. index 0000000..2be171d
  484. --- /dev/null
  485. +++ java/net/sf/l2j/gameserver/model/actor/instance/RandomCraft.java
  486. @@ -0,0 +1,524 @@
  487. +package net.sf.l2j.gameserver.model.actor.instance;
  488. +
  489. +import java.sql.Connection;
  490. +import java.sql.PreparedStatement;
  491. +import java.sql.ResultSet;
  492. +import java.sql.SQLException;
  493. +import java.util.ArrayList;
  494. +import java.util.LinkedList;
  495. +import java.util.List;
  496. +import java.util.Map;
  497. +import java.util.Random;
  498. +
  499. +import net.sf.l2j.commons.pool.ConnectionPool;
  500. +
  501. +import net.sf.l2j.Config;
  502. +import net.sf.l2j.gameserver.model.World;
  503. +import net.sf.l2j.gameserver.model.actor.Npc;
  504. +import net.sf.l2j.gameserver.model.actor.Player;
  505. +import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;
  506. +import net.sf.l2j.gameserver.model.item.instance.ItemInstance;
  507. +import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
  508. +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage;
  509. +import net.sf.l2j.gameserver.network.serverpackets.ItemList;
  510. +import net.sf.l2j.gameserver.network.serverpackets.MoveToPawn;
  511. +import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
  512. +import Base.RandomCraft.RandomCraftItem;
  513. +import Base.RandomCraft.RandomCraftXML;
  514. +
  515. +/**
  516. + * @author Terius
  517. + */
  518. +
  519. +public class RandomCraft extends Npc
  520. +{
  521. +   private boolean hasGeneratedItems;
  522. +   List<RandomCraftItem> items = new LinkedList<>();
  523. +  
  524. +   public RandomCraft(int objectId, NpcTemplate template)
  525. +   {
  526. +       super(objectId, template);
  527. +       setHasGeneratedItems(false);
  528. +   }
  529. +  
  530. +  
  531. +   @Override
  532. +    public void onInteract(Player player)
  533. +      {
  534. +           // Rotate the player to face the instance
  535. +           player.sendPacket(new MoveToPawn(player, this, Npc.INTERACTION_DISTANCE));
  536. +          
  537. +           if (hasRandomAnimation())
  538. +           {
  539. +               onRandomAnimation(1);
  540. +           }
  541. +          
  542. +           loadGeneratedItems(player);
  543. +          
  544. +           showHtmlWindow(player);
  545. +          
  546. +           // Enviar ActionFailed al jugador para evitar quedarse atascado
  547. +           player.sendPacket(ActionFailed.STATIC_PACKET);
  548. +      }
  549. +  
  550. +  
  551. +
  552. +  
  553. +   @Override
  554. +   public void onBypassFeedback(Player player, String command)
  555. +   {
  556. +       if (command.startsWith("refresh"))
  557. +       {
  558. +           // Verifique si el jugador tiene el artículo requerido (ID 57) y la cantidad (50000)
  559. +           ItemInstance item57 = player.getInventory().getItemByItemId(Config.RANDOM_CRAFT_ITEM_ID_CONSUME);
  560. +           if (item57 != null && item57.getCount() >= Config.RANDOM_CRAFT_ITEM_CONSUME_REFRESH)
  561. +           {
  562. +               // Cargue al jugador el artículo requerido (ID 57) y la cantidad (50000)
  563. +               player.getInventory().destroyItemByItemId("Random Craft", Config.RANDOM_CRAFT_ITEM_ID_CONSUME, Config.RANDOM_CRAFT_ITEM_CONSUME_REFRESH, player, this);
  564. +              
  565. +               generateItems(player);
  566. +              
  567. +               player.sendPacket(new ItemList(player, true));
  568. +              
  569. +               showHtmlWindow(player);
  570. +              
  571. +               // Almacene los elementos generados en la base de datos para el jugador
  572. +               saveGeneratedItems(player);
  573. +           }
  574. +           else
  575. +           {
  576. +               player.sendMessage("Necesitas al menos 50000 Adena para actualizar Random Craft.");
  577. +           }
  578. +       }
  579. +       else if (command.startsWith("create"))
  580. +       {
  581. +           // Eliminar los elementos generados para el jugador de la tabla RandomCraftItem
  582. +           deleteGeneratedItems(player);
  583. +          
  584. +           createItem(player);
  585. +          
  586. +           // showHtmlWindow(player);
  587. +       }
  588. +      
  589. +       else if (command.startsWith("back"))
  590. +       {
  591. +          
  592. +           showHtmlWindow(player);
  593. +       }
  594. +      
  595. +   }
  596. +  
  597. +   private void generateItems(Player player)
  598. +   {
  599. +       List<RandomCraftItem> items = new LinkedList<>();
  600. +       RandomCraftXML randomCraftXML = RandomCraftXML.getInstance();
  601. +       Map<Integer, RandomCraftItem> craftItems = randomCraftXML.getItems();
  602. +      
  603. +       // Genera 4 elementos únicos para cada jugador en función de la probabilidad
  604. +       List<Integer> selectedItems = new ArrayList<>();
  605. +       while (selectedItems.size() < 4)
  606. +       {
  607. +           int itemId = getRandomItem(craftItems);
  608. +           if (!selectedItems.contains(itemId))
  609. +           {
  610. +               selectedItems.add(itemId);
  611. +               items.add(craftItems.get(itemId));
  612. +           }
  613. +       }
  614. +      
  615. +       // Asignar los elementos generados al jugador
  616. +       player.setGeneratedCraftItems(items);
  617. +       setHasGeneratedItems(true);
  618. +      
  619. +   }
  620. +  
  621. +   private static void deleteGeneratedItems(Player player)
  622. +   {
  623. +       try (Connection con = ConnectionPool.getConnection();
  624. +           PreparedStatement stmt = con.prepareStatement("DELETE FROM RandomCraftItem WHERE object_id = ?"))
  625. +       {
  626. +           stmt.setInt(1, player.getObjectId());
  627. +           stmt.execute();
  628. +       }
  629. +       catch (SQLException e)
  630. +       {
  631. +           e.printStackTrace();
  632. +       }
  633. +   }
  634. +  
  635. +   private static void saveGeneratedItems(Player player)
  636. +   {
  637. +       try (Connection con = ConnectionPool.getConnection();
  638. +           PreparedStatement stmt = con.prepareStatement("DELETE FROM RandomCraftItem WHERE object_id = ?"))
  639. +       {
  640. +           stmt.setInt(1, player.getObjectId());
  641. +           stmt.execute();
  642. +          
  643. +           try (PreparedStatement insertStmt = con.prepareStatement("INSERT INTO RandomCraftItem (object_id, item_id, amount, chance, announce) VALUES (?, ?, ?, ?, ?)"))
  644. +           {
  645. +               insertStmt.setInt(1, player.getObjectId());
  646. +               List<RandomCraftItem> items = player.getGeneratedCraftItems();
  647. +               if (items != null)
  648. +               {
  649. +                   for (RandomCraftItem item : items)
  650. +                   {
  651. +                       insertStmt.setInt(2, item.getId());
  652. +                       insertStmt.setInt(3, item.getCantidad());
  653. +                       insertStmt.setDouble(4, item.getProbabilidad());
  654. +                       insertStmt.setBoolean(5, item.getAnnounce());
  655. +                       insertStmt.addBatch(); // Agregar la consulta al lote (batch)
  656. +                   }
  657. +                   insertStmt.executeBatch(); // Ejecutar el lote de consultas
  658. +               }
  659. +           }
  660. +       }
  661. +       catch (SQLException e)
  662. +       {
  663. +           e.printStackTrace();
  664. +       }
  665. +   }
  666. +  
  667. +   private void loadGeneratedItems(Player player)
  668. +   {
  669. +       try (Connection con = ConnectionPool.getConnection();
  670. +           PreparedStatement stmt = con.prepareStatement("SELECT item_id, amount, chance, announce FROM RandomCraftItem WHERE object_id = ?"))
  671. +       {
  672. +           stmt.setInt(1, player.getObjectId());
  673. +          
  674. +           try (ResultSet rset = stmt.executeQuery())
  675. +           {
  676. +               List<RandomCraftItem> items = new LinkedList<>();
  677. +               while (rset.next())
  678. +               {
  679. +                   int itemId = rset.getInt("item_id");
  680. +                   int amount = rset.getInt("amount");
  681. +                   int chance = rset.getInt("chance");
  682. +                   boolean announce = rset.getBoolean("announce");
  683. +                   RandomCraftItem item = new RandomCraftItem(itemId, amount, chance, announce);
  684. +                   items.add(item);
  685. +               }
  686. +              
  687. +               player.setGeneratedCraftItems(items);
  688. +               setHasGeneratedItems(!items.isEmpty());
  689. +           }
  690. +       }
  691. +       catch (SQLException e)
  692. +       {
  693. +           e.printStackTrace();
  694. +       }
  695. +   }
  696. +  
  697. +   private static int getRandomItem(Map<Integer, RandomCraftItem> craftItems)
  698. +   {
  699. +       // Calcular la suma de probabilidad total
  700. +       double totalProbability = 0;
  701. +       for (RandomCraftItem item : craftItems.values())
  702. +       {
  703. +           totalProbability += item.getProbabilidad();
  704. +       }
  705. +      
  706. +       // Generar un valor aleatorio entre 0 y la probabilidad total
  707. +       Random random = new Random();
  708. +       double randomValue = random.nextDouble() * totalProbability;
  709. +      
  710. +       // Seleccione el elemento en función de la probabilidad
  711. +       double cumulativeProbability = 0;
  712. +       for (RandomCraftItem item : craftItems.values())
  713. +       {
  714. +           cumulativeProbability += item.getProbabilidad();
  715. +           if (randomValue <= cumulativeProbability)
  716. +           {
  717. +               return item.getId();
  718. +           }
  719. +       }
  720. +      
  721. +       // Si no se selecciona ningún artículo, devolver un artículo al azar
  722. +       List<Integer> itemIds = new ArrayList<>(craftItems.keySet());
  723. +       int index = random.nextInt(itemIds.size());
  724. +       return itemIds.get(index);
  725. +   }
  726. +  
  727. +   private void createItem(Player player)
  728. +   {
  729. +       // Comprueba si la lista de elementos está vacía
  730. +       List<RandomCraftItem> items = player.getGeneratedCraftItems();
  731. +       if (items == null || items.isEmpty())
  732. +       {
  733. +           player.sendMessage("Necesita actualizar para poder crear un elemento aleatorio.");
  734. +           return;
  735. +       }
  736. +      
  737. +       // Obtén un elemento aleatorio de la lista de elementos generados
  738. +       Random random = new Random();
  739. +       int index = random.nextInt(items.size());
  740. +       RandomCraftItem craftItem = items.get(index);
  741. +      
  742. +       // Carga al jugador el artículo con ID 57 y cantidad 300000
  743. +       ItemInstance item57 = player.getInventory().getItemByItemId(Config.RANDOM_CRAFT_ITEM_ID_CONSUME);
  744. +       if (item57 != null && item57.getCount() >= Config.RANDOM_CRAFT_ITEM_CONSUME_CREATE)
  745. +       {
  746. +           player.getInventory().destroyItemByItemId("Random Craft", Config.RANDOM_CRAFT_ITEM_ID_CONSUME, Config.RANDOM_CRAFT_ITEM_CONSUME_CREATE, player, this);
  747. +          
  748. +           // Da el artículo al jugador
  749. +           ItemInstance itemInstance = player.getInventory().addItem("Random Craft", craftItem.getId(), craftItem.getCantidad(), player, this);
  750. +           if (itemInstance != null)
  751. +           {
  752. +               player.sendPacket(new ItemList(player, true));
  753. +              
  754. +               // Envía un mensaje al jugador con el nombre del artículo y la cantidad.
  755. +               String message = "¡Felicidades! Has recibido " + craftItem.getItem().getName() + " (Cantidad: " + craftItem.getCantidad() + ")";
  756. +               player.sendMessage(message);
  757. +              
  758. +               // Obtén el nombre del jugador que creó el elemento
  759. +               String creatorName = player.getName();
  760. +              
  761. +               // Comprueba si el artículo tiene announce en true en el archivo XML
  762. +               if (craftItem.getAnnounce())
  763. +               {
  764. +                  
  765. +                   for (Player players : World.getInstance().getPlayers())
  766. +                   {
  767. +                      
  768. +                       String text = creatorName + " Ha Crafteado: " + craftItem.getItem().getName() + " En el RandomCraft System";
  769. +                      
  770. +                       players.sendPacket(new ExShowScreenMessage(text, 12000));
  771. +                      
  772. +                   }
  773. +                  
  774. +               }
  775. +              
  776. +               // Borra la lista de elementos para el jugador
  777. +               player.clearGeneratedCraftItems();
  778. +               setHasGeneratedItems(false);
  779. +              
  780. +               // Muestra la ventana de felicitaciones con el item ganador
  781. +               showCongratulationsWindow(player, craftItem);
  782. +              
  783. +               return;
  784. +           }
  785. +       }
  786. +      
  787. +       player.sendMessage("Necesitas al menos 300000 Adena para crear un elemento aleatorio.");
  788. +   }
  789. +  
  790. +   private void showHtmlWindow(Player player)
  791. +   {
  792. +       StringBuilder html = new StringBuilder();
  793. +       html.append("<html><body>");
  794. +       html.append("<center>Bienvenido a Random Craft System!</center>");
  795. +       html.append("<br>");
  796. +       html.append("<center>Podras Crear 1 item entre los 4 que salgan random!</center>");
  797. +       html.append("<br>");
  798. +       html.append("<center>Les Deseo Mucha Suerte</center>");
  799. +       html.append("<br>");
  800. +       html.append("<br>");
  801. +      
  802. +       List<RandomCraftItem> items = player.getGeneratedCraftItems();
  803. +       if (items == null || items.isEmpty())
  804. +       {
  805. +           html.append("<center>La Lista Esta Vacia Dale a Refresh</center>");
  806. +       }
  807. +       else
  808. +       {
  809. +           // Generar los iconos de los artículos en forma horizontal
  810. +           for (RandomCraftItem item : items)
  811. +           {
  812. +               html.append("<img src=\"L2UI.SquareGray\" width=295 height=1>");
  813. +               html.append("<div align=center>");
  814. +               html.append("<table>");
  815. +               html.append("<tr>");
  816. +               html.append("<td>");
  817. +               html.append("<img src=").append(item.getIcon()).append(" width=32 height=32>");
  818. +               html.append("</td>");
  819. +               html.append("<td width=260>");
  820. +               html.append("<font color=LEVEL>").append(item.getItem().getName()).append("</font>");
  821. +              
  822. +               html.append("</td>");
  823. +               html.append("</tr>");
  824. +               html.append("</table>");
  825. +               html.append("</div>");
  826. +               html.append("<img src=\"L2UI.SquareGray\" width=295 height=1>");
  827. +               html.append("<br>");
  828. +           }
  829. +       }
  830. +      
  831. +       html.append("<br>");
  832. +       html.append("<br>");
  833. +       html.append("<center>");
  834. +       html.append("<table>");
  835. +       html.append("<tr>");
  836. +       html.append("<td width=75 height=21>");
  837. +       html.append("<button value=\"Refresh\" action=\"bypass -h npc_").append(getObjectId()).append("_refresh\" width=75 height=21 back=\"L2UI.DefaultButton_click\" fore=\"L2UI.DefaultButton\">");
  838. +       html.append("</td>");
  839. +       html.append("<td width=75 height=21>");
  840. +       html.append("<button value=\"Create\" action=\"bypass -h npc_").append(getObjectId()).append("_create\" width=75 height=21 back=\"L2UI.DefaultButton_click\" fore=\"L2UI.DefaultButton\">");
  841. +       html.append("</td>");
  842. +       html.append("</tr>");
  843. +       html.append("</table>");
  844. +       html.append("</center>");
  845. +      
  846. +       html.append("</body></html>");
  847. +      
  848. +       showHtmlWindow(player, html.toString());
  849. +   }
  850. +  
  851. +   private void showHtmlWindow(Player player, String htmlContent)
  852. +   {
  853. +       NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
  854. +       html.setHtml(htmlContent);
  855. +      
  856. +       player.sendPacket(html);
  857. +   }
  858. +  
  859. +   private void showCongratulationsWindow(Player player, RandomCraftItem craftItem)
  860. +   {
  861. +       StringBuilder html = new StringBuilder();
  862. +      
  863. +       html.append("<html><body>");
  864. +       html.append("<center>Felicidades, has ganado un item</center>");
  865. +       html.append("<br>");
  866. +       html.append("<center>¡Has recibido</center>");
  867. +       html.append("<br>");
  868. +       html.append("<br>");
  869. +       html.append("<img src=\"L2UI.SquareGray\" width=295 height=1>");
  870. +       html.append("<center>");
  871. +       html.append("<table>");
  872. +       html.append("<tr>");
  873. +       html.append("<td>");
  874. +       html.append("<img src=").append(craftItem.getIcon()).append(" width=32 height=32>");
  875. +       html.append("</td>");
  876. +       html.append("<td width=260>");
  877. +       html.append("<font color=LEVEL>").append(craftItem.getItem().getName()).append("</font>");
  878. +       html.append("</td>");
  879. +       html.append("</tr>");
  880. +       html.append("</table>");
  881. +       html.append("</center>");
  882. +       html.append("<img src=\"L2UI.SquareGray\" width=295 height=1>");
  883. +       html.append("<br>");
  884. +       html.append("<br>");
  885. +       html.append("<br>");
  886. +       html.append("<br>");
  887. +       html.append("<center>");
  888. +       html.append("<button value=\"Back\" action=\"bypass -h npc_").append(getObjectId()).append("_back\" width=75 height=21 back=\"L2UI.DefaultButton_click\" fore=\"L2UI.DefaultButton\">");
  889. +       html.append("</center>");
  890. +       html.append("</body></html>");
  891. +      
  892. +       showHtmlWindow(player, html.toString());
  893. +   }
  894. +  
  895. +   /**
  896. +    * @return the hasGeneratedItems
  897. +    */
  898. +   public boolean isHasGeneratedItems()
  899. +   {
  900. +       return hasGeneratedItems;
  901. +   }
  902. +  
  903. +   /**
  904. +    * @param hasGeneratedItems the hasGeneratedItems to set
  905. +    */
  906. +   public void setHasGeneratedItems(boolean hasGeneratedItems)
  907. +   {
  908. +       this.hasGeneratedItems = hasGeneratedItems;
  909. +   }
  910. +}
  911. diff --git java/net/sf/l2j/gameserver/model/item/kind/Item.java java/net/sf/l2j/gameserver/model/item/kind/Item.java
  912. index 9c641b1..054e694 100644
  913. --- java/net/sf/l2j/gameserver/model/item/kind/Item.java
  914. +++ java/net/sf/l2j/gameserver/model/item/kind/Item.java
  915. @@ -34,6 +34,8 @@
  916.  import net.sf.l2j.gameserver.skills.basefuncs.FuncTemplate;
  917.  import net.sf.l2j.gameserver.skills.conditions.Condition;
  918.  
  919. +import Base.Data.IconTable;
  920. +
  921.  /**
  922.   * This container contains all informations concerning an item (weapon, armor, etc).
  923.   */
  924. @@ -531,6 +533,16 @@
  925.         return _defaultAction;
  926.     }
  927.    
  928. +  
  929. +   public String getIcon()
  930. +   {
  931. +       return IconTable.getInstance().getIcon(getItemId());
  932. +   }
  933. +  
  934. +  
  935. +  
  936. +  
  937. +  
  938.     /**
  939.      * Returns the name of the item
  940.      * @return String
  941. diff --git server/gameserver/data/xml/RandomCraft.xml server/gameserver/data/xml/RandomCraft.xml
  942. new file mode 100644
  943. index 0000000..ff31b12
  944. --- /dev/null
  945. +++ server/gameserver/data/xml/RandomCraft.xml
  946. @@ -0,0 +1,38 @@
  947. +<?xml version="1.0" encoding="UTF-8"?>
  948. +<rewards>
  949. +  <item id="5644" count="1" chance="25" announce="false"/>
  950. +  <item id="5704" count="1" chance="25" announce="false"/>
  951. +  <item id="5706" count="1" chance="25" announce="false"/>
  952. +  <item id="5709" count="1" chance="10" announce="false"/>
  953. +  <item id="5714" count="1" chance="10" announce="false"/>
  954. +  <item id="5715" count="1" chance="10" announce="false"/>
  955. +  <item id="5720" count="1" chance="10" announce="false"/>
  956. +  <item id="5727" count="1" chance="10" announce="false"/>
  957. +  <item id="5765" count="1" chance="15" announce="false"/>
  958. +  <item id="5766" count="1" chance="15" announce="false"/>
  959. +  <item id="5767" count="1" chance="15" announce="false"/>
  960. +  <item id="5768" count="1" chance="15" announce="false"/>
  961. +  <item id="5769" count="1" chance="15" announce="false"/>
  962. +  <item id="5770" count="1" chance="20" announce="false"/>
  963. +  <item id="5771" count="1" chance="15" announce="false"/>
  964. +  <item id="5772" count="1" chance="15" announce="false"/>
  965. +  <item id="5773" count="1" chance="15" announce="false"/>
  966. +  <item id="5774" count="1" chance="15" announce="false"/>
  967. +  <item id="5775" count="1" chance="15" announce="false"/>
  968. +  <item id="5776" count="1" chance="15" announce="false"/>
  969. +  <item id="5777" count="1" chance="15" announce="false"/>
  970. +  <item id="5778" count="1" chance="15" announce="false"/>
  971. +  <item id="5779" count="1" chance="15" announce="false"/>
  972. +  <item id="5780" count="1" chance="20" announce="false"/>
  973. +  <item id="5781" count="1" chance="20" announce="false"/>
  974. +  <item id="5782" count="1" chance="20" announce="false"/>
  975. +  <item id="5783" count="1" chance="20" announce="false"/>
  976. +  <item id="5784" count="1" chance="20" announce="false"/>
  977. +  <item id="5785" count="1" chance="20" announce="false"/>
  978. +  <item id="5787" count="1" chance="20" announce="false"/>
  979. +  <item id="6367" count="1" chance="25" announce="false"/>
  980. +  <item id="6372" count="1" chance="25" announce="false"/>
  981. +  <item id="6373" count="1" chance="2" announce="true"/>
  982. +  <item id="6374" count="1" chance="2" announce="true"/>
  983. +  <item id="6375" count="1" chance="2" announce="true"/>
  984. +  <item id="6376" count="1" chance="2" announce="true"/>
  985. +  <item id="6377" count="1" chance="2" announce="true"/>
  986. +  <item id="6378" count="1" chance="2" announce="true"/>
  987. +  <item id="6379" count="1" chance="2" announce="true"/>
  988. +  <item id="6380" count="1" chance="2" announce="true"/>
  989. +  <item id="6381" count="1" chance="2" announce="true"/>
  990. +  <item id="6382" count="1" chance="2" announce="true"/>
  991. +  <item id="6383" count="1" chance="2" announce="true"/>
  992. +  <item id="6384" count="1" chance="2" announce="true"/>
  993. +  <item id="6385" count="1" chance="2" announce="true"/>
  994. +  <item id="6386" count="1" chance="2" announce="true"/>
  995. +  <item id="6392" count="1" chance="10" announce="false"/>
  996. +  <item id="6582" count="1" chance="2" announce="true"/>
  997. +  <item id="6587" count="1" chance="2" announce="true"/>
  998. +  <item id="6590" count="1" chance="2" announce="true"/>
  999. +  <item id="6594" count="1" chance="2" announce="true"/>
  1000. +  <item id="6597" count="1" chance="2" announce="true"/>
  1001. +  <item id="6599" count="1" chance="2" announce="true"/>
  1002. +  <item id="6604" count="1" chance="2" announce="true"/>
  1003. +  <item id="6606" count="1" chance="2" announce="true"/>
  1004. +  <item id="6609" count="1" chance="2" announce="true"/>
  1005. +</rewards>
  1006. +
  1007.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement