just coded, didnt tested it
CORE:
Index: java/com/l2jserver/gameserver/datatables/HerbDropTable.java
===================================================================
--- java/com/l2jserver/gameserver/datatables/HerbDropTable.java (revision 4838)
+++ java/com/l2jserver/gameserver/datatables/HerbDropTable.java (working copy)
@@ -60,7 +60,7 @@
{
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement("SELECT "
- + L2DatabaseFactory.getInstance().safetyString(new String[] { "groupId", "itemId", "min", "max", "category", "chance" })
+ + L2DatabaseFactory.getInstance().safetyString(new String[] { "groupId", "itemId", "min", "max", "category", "chance", "enchant", "enchantChance" })
+ " FROM herb_droplist_groups ORDER BY groupId, chance DESC");
ResultSet dropData = statement.executeQuery();
L2DropData dropDat = null;
@@ -83,6 +83,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 categoryType = dropData.getInt("category");
Index: java/com/l2jserver/gameserver/datatables/NpcTable.java
===================================================================
--- java/com/l2jserver/gameserver/datatables/NpcTable.java (revision 4838)
+++ java/com/l2jserver/gameserver/datatables/NpcTable.java (working copy)
@@ -204,7 +204,7 @@
try
{
statement = con.prepareStatement("SELECT "
- + L2DatabaseFactory.getInstance().safetyString(new String[] { "mobId", "itemId", "min", "max", "category", "chance" })
+ + L2DatabaseFactory.getInstance().safetyString(new String[] { "mobId", "itemId", "min", "max", "category", "chance", "enchant", "enchantChance" })
+ " FROM droplist ORDER BY mobId, chance DESC");
ResultSet dropData = statement.executeQuery();
L2DropData dropDat = null;
@@ -225,6 +225,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: java/com/l2jserver/gameserver/model/actor/L2Attackable.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/L2Attackable.java (revision 4838)
+++ java/com/l2jserver/gameserver/model/actor/L2Attackable.java (working copy)
@@ -236,15 +236,28 @@
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;}
public int getCount() { return _count;}
+
+ public int getEnchant() { return _enchant; }
+ public int getEnchantChance() { return _chance; }
}
private FastMap<L2Character, AggroInfo> _aggroList = new FastMap<L2Character, AggroInfo>().shared();
@@ -1268,7 +1281,7 @@
itemCount *= Config.L2JMOD_CHAMPION_ADENAS_REWARDS;
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 no drops.");
@@ -1409,7 +1422,7 @@
itemCount = 1;
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 no drops.");
}
@@ -1568,7 +1581,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 no drops.");
}
@@ -1796,6 +1809,15 @@
{
// 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(), lastAttacker, this);
+ if(item.getEnchant() > 0)
+ {
+ if(ditem.isWeapon() || ditem.isArmor())
+ {
+ 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: java/com/l2jserver/gameserver/model/L2DropData.java
===================================================================
--- java/com/l2jserver/gameserver/model/L2DropData.java (revision 4838)
+++ java/com/l2jserver/gameserver/model/L2DropData.java (working copy)
@@ -32,6 +32,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;
@@ -53,6 +55,16 @@
_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
* @return int
@@ -80,6 +92,16 @@
return _chance;
}
+ public int getEnchant()
+ {
+ return _dropEnchant;
+ }
+
+ public int getEnchantChance()
+ {
+ return _enchantChance;
+ }
+
/**
* Sets the value for minimal quantity of dropped items
* @param mindrop : int designating the quantity
Index: java/com/l2jserver/gameserver/script/faenor/FaenorInterface.java
===================================================================
--- java/com/l2jserver/gameserver/script/faenor/FaenorInterface.java (revision 4838)
+++ java/com/l2jserver/gameserver/script/faenor/FaenorInterface.java (working copy)
@@ -72,6 +72,26 @@
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)
+ {
+ throw new NullPointerException();
+ }
+ 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
@@ -96,6 +116,28 @@
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.
DP:
Index: data/scripts/handlers/admincommandhandlers/AdminEditNpc.java
===================================================================
--- data/scripts/handlers/admincommandhandlers/AdminEditNpc.java (revision 8275)
+++ data/scripts/handlers/admincommandhandlers/AdminEditNpc.java (working copy)
@@ -1333,7 +1333,7 @@
con = L2DatabaseFactory.getInstance().getConnection();
L2DropData dropData = null;
- PreparedStatement statement = con.prepareStatement("SELECT `mobId`, `itemId`, `min`, `max`, `category`, `chance` FROM `droplist` WHERE `mobId`=?");
+ PreparedStatement statement = con.prepareStatement("SELECT `mobId`, `itemId`, `min`, `max`, `category`, `chance`, `enchant`, `enchantChance` FROM `droplist` WHERE `mobId`=?");
statement.setInt(1, npcId);
ResultSet dropDataList = statement.executeQuery();
@@ -1345,6 +1345,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");
npcData.addDropData(dropData, category);
Also, you will need to execute this in your database:
ALTER TABLE `droplist` ADD `enchant` int(5) DEFAULT -1;
ALTER TABLE `droplist` ADD `enchantChance` int(3) DEFAULT 0;