Jump to content
  • 0

Question

Posted

hello can some help me to add this to acis?

 

### Eclipse Workspace Patch 1.0
#P elfobitch
Index: gameserver/head-src/com/l2jfrozen/gameserver/model/L2Attackable.java
===================================================================
--- gameserver/head-src/com/l2jfrozen/gameserver/model/L2Attackable.java   (revision 903)
+++ gameserver/head-src/com/l2jfrozen/gameserver/model/L2Attackable.java   (working copy)
@@ -244,12 +244,22 @@
       protected int _itemId;
       protected int _count;
 
+      private int _enchant = -1;
+      private int _chance = 0;
+      
       public RewardItem(int itemId, int count)
       {
          _itemId = itemId;
          _count = count;
       }
 
+      public RewardItem(int itemId, int count, int enchant, int chance)
+      {
+         this(itemId, count);
+         _enchant = enchant;
+         _chance = chance;
+      }
+      
       public int getItemId()
       {
          return _itemId;
@@ -259,6 +269,9 @@
       {
          return _count;
       }
+            
+      public int getEnchant() { return _enchant; }
+      public int getEnchantChance() { return _chance; }
    }
 
    /**
@@ -1560,7 +1573,7 @@
       }
 
       if(itemCount > 0)
-         return new RewardItem(drop.getItemId(), itemCount);
+         return new RewardItem(drop.getItemId(), itemCount, drop.getEnchant(), drop.getEnchantChance());
       else if(itemCount == 0 && Config.DEBUG)
       {
          _log.fine("Roll produced 0 items to drop...");
@@ -1845,7 +1858,7 @@
          }
 
          if(itemCount > 0)
-            return new RewardItem(drop.getItemId(), itemCount);
+            return new RewardItem(drop.getItemId(), itemCount, drop.getEnchant(), drop.getEnchantChance());
          else if(itemCount == 0 && Config.DEBUG)
          {
             _log.fine("Roll produced 0 items to drop...");
@@ -2503,6 +2516,16 @@
          // Init the dropped L2ItemInstance and add it in the world as a visible object at the position where mob was last
          ditem = ItemTable.getInstance().createItem("Loot", item.getItemId(), item.getCount(), mainDamageDealer, this);
          ditem.getDropProtection().protect(mainDamageDealer);
+            if(item.getEnchant() > 0)
+            {
+               if(ditem.getItem().getType1() == L2Item.TYPE1_WEAPON_RING_EARRING_NECKLACE
+                     || ditem.getItem().getType1() == L2Item.TYPE1_SHIELD_ARMOR)
+               {
+                  double chance = Rnd.get(1, 100);
+                  if(chance <= item.getEnchantChance())
+                     ditem.setEnchantLevel(item.getEnchant());
+               }
+            }
          ditem.dropMe(this, newX, newY, newZ);
 
          // Add drop to auto destroy item task
Index: gameserver/head-src/com/l2jfrozen/gameserver/datatables/sql/NpcTable.java
===================================================================
--- gameserver/head-src/com/l2jfrozen/gameserver/datatables/sql/NpcTable.java   (revision 903)
+++ gameserver/head-src/com/l2jfrozen/gameserver/datatables/sql/NpcTable.java   (working copy)
@@ -247,7 +247,7 @@
             {
                statement = con.prepareStatement("SELECT " + L2DatabaseFactory.getInstance().safetyString(new String[]
                {
-                     "mobId", "itemId", "min", "max", "category", "chance"
+                     "mobId", "itemId", "min", "max", "category", "chance", "enchant", "enchantChance"
                }) + " FROM custom_droplist ORDER BY mobId, chance DESC");
                ResultSet dropData = statement.executeQuery();
 
@@ -270,6 +270,8 @@
                   dropDat.setMinDrop(dropData.getInt("min"));
                   dropDat.setMaxDrop(dropData.getInt("max"));
                   dropDat.setChance(dropData.getInt("chance"));
+                  dropDat.setEnchant(dropData.getInt("enchant"));
+                  dropDat.setEnchantChance(dropData.getInt("enchantChance"));
 
                   int category = dropData.getInt("category");
 
@@ -295,7 +297,7 @@
          {
             statement = con.prepareStatement("SELECT " + L2DatabaseFactory.getInstance().safetyString(new String[]
             {
-                  "mobId", "itemId", "min", "max", "category", "chance"
+                  "mobId", "itemId", "min", "max", "category", "chance", "enchant", "enchantChance"
             }) + " FROM droplist ORDER BY mobId, chance DESC");
             ResultSet dropData = statement.executeQuery();
             L2DropData dropDat = null;
@@ -319,6 +321,8 @@
                dropDat.setMinDrop(dropData.getInt("min"));
                dropDat.setMaxDrop(dropData.getInt("max"));
                dropDat.setChance(dropData.getInt("chance"));
+               dropDat.setEnchant(dropData.getInt("enchant"));
+               dropDat.setEnchantChance(dropData.getInt("enchantChance"));
 
                int category = dropData.getInt("category");
 
Index: gameserver/head-src/com/l2jfrozen/gameserver/script/faenor/FaenorInterface.java
===================================================================
--- gameserver/head-src/com/l2jfrozen/gameserver/script/faenor/FaenorInterface.java   (revision 903)
+++ gameserver/head-src/com/l2jfrozen/gameserver/script/faenor/FaenorInterface.java   (working copy)
@@ -82,6 +82,27 @@
       addDrop(npc, drop, false);
    }
 
+   public void addQuestDrop(int npcID, int itemID, int min, int max, int chance, String questID, String[] states,
+         int enchant, int enchantChance)
+   {
+      L2NpcTemplate npc = npcTable.getTemplate(npcID);
+      if (npc == null)
+      {
+         _log.info("FeanorInterface: Npc "+npcID+" is null..");
+         return;
+      }
+      L2DropData drop = new L2DropData();
+      drop.setItemId(itemID);
+      drop.setMinDrop(min);
+      drop.setMaxDrop(max);
+      drop.setEnchant(enchant);
+      drop.setEnchantChance(enchantChance);
+      drop.setChance(chance);
+      drop.setQuestID(questID);
+      drop.addStates(states);
+      addDrop(npc, drop, false);
+   }
+   
    /**
     * Adds a new Drop to an NPC
     *
@@ -106,7 +127,31 @@
 
       addDrop(npc, drop, sweep);
    }
+   
+   public void addDrop(int npcID, int itemID, int min, int max, boolean sweep, int chance,
+         int enchant, int enchantChance) throws NullPointerException
+   {
+      L2NpcTemplate npc = npcTable.getTemplate(npcID);
+      if (npc == null)
+      {
+         if (Config.DEBUG)
+         {
+            _log.warning("Npc doesnt Exist");
+         }
+         throw new NullPointerException();
+      }
+      L2DropData drop = new L2DropData();
+      drop.setItemId(itemID);
+      drop.setMinDrop(min);
+      drop.setMaxDrop(max);
+      drop.setChance(chance);
+      drop.setEnchant(enchant);
+      drop.setEnchantChance(enchantChance);
+      
+      addDrop(npc, drop, sweep);
+   }
 
+   
    /**
     * Adds a new drop to an NPC. If the drop is sweep, it adds it to the NPC's Sweep category If the drop is non-sweep,
     * it creates a new category for this drop.
Index: gameserver/head-src/com/l2jfrozen/gameserver/handler/admincommandhandlers/AdminEditNpc.java
===================================================================
--- gameserver/head-src/com/l2jfrozen/gameserver/handler/admincommandhandlers/AdminEditNpc.java   (revision 903)
+++ gameserver/head-src/com/l2jfrozen/gameserver/handler/admincommandhandlers/AdminEditNpc.java   (working copy)
@@ -407,7 +407,7 @@
                      e.printStackTrace();
                }
             }
-            else if(st.countTokens() == 6)
+            else if(st.countTokens() == 8)
             {
                try
                {
@@ -417,8 +417,10 @@
                   int min = Integer.parseInt(st.nextToken());
                   int max = Integer.parseInt(st.nextToken());
                   int chance = Integer.parseInt(st.nextToken());
+                  int enchant = Integer.parseInt(st.nextToken());
+                  int enchantChance = Integer.parseInt(st.nextToken());
 
-                  updateDropData(activeChar, npcId, itemId, min, max, category, chance);
+                  updateDropData(activeChar, npcId, itemId, min, max, category, chance, enchant, enchantChance);
                }
                catch(Exception e)
                {
@@ -430,7 +432,7 @@
             }
             else
             {
-               activeChar.sendMessage("Usage: //edit_drop <npc_id> <item_id> <category> [<min> <max> <chance>]");
+               activeChar.sendMessage("Usage: //edit_drop <npc_id> <item_id> <category> [<min> <max> <chance> <enchant> <enchantChance>]");
             }
 
             st = null;
@@ -440,7 +442,7 @@
             if(Config.ENABLE_ALL_EXCEPTIONS)
                e.printStackTrace();
             
-            activeChar.sendMessage("Usage: //edit_drop <npc_id> <item_id> <category> [<min> <max> <chance>]");
+            activeChar.sendMessage("Usage: //edit_drop <npc_id> <item_id> <category> [<min> <max> <chance> <enchant> <enchantChance>]");
          }
       }
       else if(command.startsWith("admin_add_drop "))
@@ -474,7 +476,7 @@
                   npcData = null;
                }
             }
-            else if(st.countTokens() == 6)
+            else if(st.countTokens() == 8)
             {
                try
                {
@@ -484,8 +486,10 @@
                   int min = Integer.parseInt(st.nextToken());
                   int max = Integer.parseInt(st.nextToken());
                   int chance = Integer.parseInt(st.nextToken());
+                  int enchant = Integer.parseInt(st.nextToken());
+                  int enchantChance = Integer.parseInt(st.nextToken());
 
-                  addDropData(activeChar, npcId, itemId, min, max, category, chance);
+                  addDropData(activeChar, npcId, itemId, min, max, category, chance, enchant, enchantChance);
                }
                catch(Exception e)
                {
@@ -497,7 +501,7 @@
             }
             else
             {
-               activeChar.sendMessage("Usage: //add_drop <npc_id> [<item_id> <category> <min> <max> <chance>]");
+               activeChar.sendMessage("Usage: //add_drop <npc_id> [<item_id> <category> <min> <max> <chance> <enchant> <enchantChance>]");
             }
 
             st = null;
@@ -507,7 +511,7 @@
             if(Config.ENABLE_ALL_EXCEPTIONS)
                e.printStackTrace();
             
-            activeChar.sendMessage("Usage: //add_drop <npc_id> [<item_id> <category> <min> <max> <chance>]");
+            activeChar.sendMessage("Usage: //add_drop <npc_id> [<item_id> <category> <min> <max> <chance> <enchant> <enchantChance>]");
          }
       }
       else if(command.startsWith("admin_del_drop "))
@@ -1323,7 +1327,7 @@
       {
          con = L2DatabaseFactory.getInstance().getConnection(false);
 
-         PreparedStatement statement = con.prepareStatement("SELECT mobId, itemId, min, max, category, chance FROM droplist WHERE mobId=" + npcId + " AND itemId=" + itemId + " AND category=" + category);
+         PreparedStatement statement = con.prepareStatement("SELECT mobId, itemId, min, max, category, chance, enchant, enchantChance FROM droplist WHERE mobId=" + npcId + " AND itemId=" + itemId + " AND category=" + category);
          ResultSet dropData = statement.executeQuery();
 
          NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
@@ -1340,9 +1344,11 @@
             replyMSG.append("<tr><td>MIN(" + dropData.getInt("min") + ")</td><td><edit var=\"min\" width=80></td></tr>");
             replyMSG.append("<tr><td>MAX(" + dropData.getInt("max") + ")</td><td><edit var=\"max\" width=80></td></tr>");
             replyMSG.append("<tr><td>CHANCE(" + dropData.getInt("chance") + ")</td><td><edit var=\"chance\" width=80></td></tr>");
+            replyMSG.append("<tr><td>ENC-VALUE(" + dropData.getInt("enchant") + ")</td><td><edit var=\"enchant\" width=80></td></tr>");
+            replyMSG.append("<tr><td>ENC-CHANCE(" + dropData.getInt("enchantChance") + ")</td><td><edit var=\"enchantChance\" width=80></td></tr>");
             replyMSG.append("</table>");
             replyMSG.append("<center>");
-            replyMSG.append("<button value=\"Save Modify\" action=\"bypass -h admin_edit_drop " + npcId + " " + itemId + " " + category + " $min $max $chance\"  width=100 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">");
+            replyMSG.append("<button value=\"Save Modify\" action=\"bypass -h admin_edit_drop " + npcId + " " + itemId + " " + category + " $min $max $chance $enchant $enchantChance\"  width=100 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">");
             replyMSG.append("<br><button value=\"DropList\" action=\"bypass -h admin_show_droplist " + dropData.getInt("mobId") + "\"  width=100 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">");
             replyMSG.append("</center>");
          }
@@ -1383,9 +1389,11 @@
       replyMSG.append("<tr><td>MAX</td><td><edit var=\"max\" width=80></td></tr>");
       replyMSG.append("<tr><td>CATEGORY(sweep=-1)</td><td><edit var=\"category\" width=80></td></tr>");
       replyMSG.append("<tr><td>CHANCE(0-1000000)</td><td><edit var=\"chance\" width=80></td></tr>");
+      replyMSG.append("<tr><td>ENC-VALUE(0-65535)</td><td><edit var=\"enchant\" width=80></td></tr>");
+      replyMSG.append("<tr><td>ENC-CHANCE(0-100)</td><td><edit var=\"enchantChance\" width=80></td></tr>");
       replyMSG.append("</table>");
       replyMSG.append("<center>");
-      replyMSG.append("<button value=\"SAVE\" action=\"bypass -h admin_add_drop " + npcData.npcId + " $itemId $category $min $max $chance\"  width=100 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">");
+      replyMSG.append("<button value=\"SAVE\" action=\"bypass -h admin_add_drop " + npcData.npcId + " $itemId $category $min $max $chance $enchant $enchantChance\"  width=100 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">");
       replyMSG.append("<br><button value=\"DropList\" action=\"bypass -h admin_show_droplist " + npcData.npcId + "\"  width=100 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">");
       replyMSG.append("</center>");
       replyMSG.append("</body></html>");
@@ -1397,7 +1405,7 @@
       replyMSG = null;
    }
 
-   private void updateDropData(L2PcInstance activeChar, int npcId, int itemId, int min, int max, int category, int chance)
+   private void updateDropData(L2PcInstance activeChar, int npcId, int itemId, int min, int max, int category, int chance, int enchant, int enchantChance)
    {
       Connection con = null;
 
@@ -1405,13 +1413,15 @@
       {
          con = L2DatabaseFactory.getInstance().getConnection(false);
 
-         PreparedStatement statement = con.prepareStatement("UPDATE droplist SET min=?, max=?, chance=? WHERE mobId=? AND itemId=? AND category=?");
+         PreparedStatement statement = con.prepareStatement("UPDATE droplist SET min=?, max=?, chance=?, enchant=?, enchantChance=? WHERE mobId=? AND itemId=? AND category=?");
          statement.setInt(1, min);
          statement.setInt(2, max);
          statement.setInt(3, chance);
          statement.setInt(4, npcId);
          statement.setInt(5, itemId);
          statement.setInt(6, category);
+         statement.setInt(7, enchant);
+         statement.setInt(8, enchantChance);
 
          statement.execute();
          statement.close();
@@ -1464,7 +1474,7 @@
       }
    }
 
-   private void addDropData(L2PcInstance activeChar, int npcId, int itemId, int min, int max, int category, int chance)
+   private void addDropData(L2PcInstance activeChar, int npcId, int itemId, int min, int max, int category, int chance, int enchant, int enchantChance)
    {
       Connection con = null;
 
@@ -1472,13 +1482,16 @@
       {
          con = L2DatabaseFactory.getInstance().getConnection(false);
 
-         PreparedStatement statement = con.prepareStatement("INSERT INTO droplist(mobId, itemId, min, max, category, chance) values(?,?,?,?,?,?)");
+         PreparedStatement statement = con.prepareStatement("INSERT INTO droplist(mobId, itemId, min, max, category, chance, enchant, enchantChance) values(?,?,?,?,?,?,?,?)");
          statement.setInt(1, npcId);
          statement.setInt(2, itemId);
          statement.setInt(3, min);
          statement.setInt(4, max);
          statement.setInt(5, category);
          statement.setInt(6, chance);
+         statement.setInt(7, enchant);
+         statement.setInt(8, enchantChance);
+         
          statement.execute();
          statement.close();
          statement = null;
@@ -1573,7 +1586,7 @@
 
          PreparedStatement statement = con.prepareStatement("SELECT " + L2DatabaseFactory.getInstance().safetyString(new String[]
          {
-               "mobId", "itemId", "min", "max", "category", "chance"
+               "mobId", "itemId", "min", "max", "category", "chance", "enchant", "enchantChance"
          }) + " FROM droplist WHERE mobId=?");
          statement.setInt(1, npcId);
          ResultSet dropDataList = statement.executeQuery();
@@ -1586,6 +1599,8 @@
             dropData.setMinDrop(dropDataList.getInt("min"));
             dropData.setMaxDrop(dropDataList.getInt("max"));
             dropData.setChance(dropDataList.getInt("chance"));
+            dropData.setEnchant(dropDataList.getInt("enchant"));
+            dropData.setEnchantChance(dropDataList.getInt("enchantChance"));
 
             int category = dropDataList.getInt("category");
 
Index: gameserver/head-src/com/l2jfrozen/gameserver/model/L2DropData.java
===================================================================
--- gameserver/head-src/com/l2jfrozen/gameserver/model/L2DropData.java   (revision 903)
+++ gameserver/head-src/com/l2jfrozen/gameserver/model/L2DropData.java   (working copy)
@@ -33,6 +33,8 @@
    private int _minDrop;
    private int _maxDrop;
    private int _chance;
+   private int _dropEnchant = -1;
+   private int _enchantChance = 0;
    private String _questID = null;
    private String[] _stateID = null;
 
@@ -55,7 +57,17 @@
    {
       _itemId = itemId;
    }
-
+   
+   public void setEnchant(final int enchant)
+   {
+      _dropEnchant = enchant;
+   }
+   
+   public void setEnchantChance(final int chance)
+   {
+      _enchantChance = chance;
+   }
+   
    /**
     * Returns the minimum quantity of items dropped
     *
@@ -86,6 +98,16 @@
       return _chance;
    }
 
+   public int getEnchant()
+   {
+      return _dropEnchant;
+   }
+   
+   public int getEnchantChance()
+   {
+      return _enchantChance;
+   }
+
    /**
     * Sets the value for minimal quantity of dropped items
     *

 


ALTER TABLE `droplist` ADD `enchant` int(5) DEFAULT -1;
ALTER TABLE `droplist` ADD `enchantChance` int(3) DEFAULT 0;
ALTER TABLE `custom_droplist` ADD `enchant` int(5) DEFAULT -1;
ALTER TABLE `custom_droplist` ADD `enchantChance` int(3) DEFAULT 0;

 

2 answers to this question

Recommended Posts

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • I think you should check the video more carefully you missing something very important 😛      
    • Im responding to an anonymous account with 3 posts, almost no background, and practically zero useful information added to the discussion. On top of that, the topic title is misleading  calling it "Lucera Source Code" gives a completely different impression from what is actually being presented.   I didn’t say anything different. Therefore, I have no clue how his process produces the same desirable result.   And here you are creating drama. Your topic title clearly says "Lucera Source Code," which is not actually the case, or at least that’s how it looked when I first clicked on it, so I don’t think I was completely off. There’s also no significant information about your process like  what difficulties you faced, what tools you used, or anything else meaningful. Yet you still expect others to provide value based on what? I’m not talking about your project itself which, by the way, good job. I’m talking about the topic itself as a source of value for this forum, because right now it doesn’t really offer much in that regard. So regarding the semantics, yes, wording does matter.  
    • You are funny guy! 😄 😄 😄    I was working with Lucera long before “AI apps” became fashionable. This was not something I generated in one day with a prompt. It took me years of work, testing, debugging and fixing broken decompiled code.   Of course a decompiled source is not the original private repository with the original comments, history and developer structure. Nobody said it is the same Git repository. But saying it is only “guesses” is also wrong.   When you decompile, rebuild, fix thousands of compile/runtime issues, restore broken logic, reconnect scripts, fix bad casts, repair database calls, compile it again and run it in-game, at that point it is no longer just a guess.   It becomes a working reconstructed source base!   The important part is not whether it is byte-for-byte identical to the original private source. The important part is that I can now work directly inside the code, change core logic, rebuild scripts, fix bugs and continue development without being locked behind closed binaries.   Does it compile? Yes. Does it run in-game? Yes. Can I modify core systems directly? Yes. Can I continue development independently? Yes.   So call it reconstructed, decompiled, cleaned, restored or whatever name you prefer. The result is still the same: I have a working source environment that gives me control over the lucera2 project.   And that was exactly the goal!   🙂 
    • You clearly have no idea who you're talking to.   I've been working in the cheat industry for years and have developed cheats for multiple games, including projects that operate at kernel level and bypass protections far more advanced than anything Lineage 2 has ever had. Compared to that, Lineage 2 is low tier and technically simple.   As for the topic title, it's perfectly fine. The only thing I forgot is that this forum hasn't changed after all these years. It's still full of people who would rather argue semantics and act like experts than contribute anything meaningful to the discussion. Whether you call it reverse engineering, reconstruction, or educated guesses doesn't change the fact that the result works and achieves its purpose.   Honestly, I don't think there's any reason for me to keep posting here. Most of the replies add nothing of value and only prove why many experienced developers stopped sharing their work on this forum years ago.       Nobody said Lucera is a bad product. In fact, the reason people spend time decompiling it is because it is a good product and has value.   What I find funny is that everyone openly acknowledges that Lucera gets decompiled, yet when someone actually discusses the technical side of it, people suddenly act like it's some impossible or mythical process.   Reverse engineering software is nothing new. It has existed for decades and happens in every industry, from games to operating systems to commercial applications. Lucera is no exception.     I never said Deazer is a bad developer. Quite the opposite, he's a skilled developer and Lucera is one of the most stable projects I've worked with.   My only criticism is that, as a customer, you're heavily dependent on him. If he's willing to help, you'll get an answer quickly. If he's not interested in the issue or simply doesn't feel like dealing with it, then you're left to research and solve it on your own.   That's not necessarily a technical problem with Lucera itself, it's just one of the downsides of relying on a closed source project where a lot depends on a single developer.   From a stability standpoint, though, Lucera has always been among the best files available in my experience.
    • Scammers inc.  What you want to learn? Cooding? or just work with data files on builds.
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..