View difference between Paste ID: rWULu9j6 and 09vv6cj7
SHOW: | | - or go back to the newest paste.
1
diff --git a/aCis_datapack/data/xml/monstersDrops.xml b/aCis_datapack/data/xml/monstersDrops.xml
2
new file mode 100644
3
index 0000000..184d745
4
--- /dev/null
5
+++ b/aCis_datapack/data/xml/monstersDrops.xml
6
@@ -0,0 +1,6 @@
7
+<?xml version="1.0" encoding="UTF-8"?>
8
+<list>
9
+       <drops npcId="21337">
10
+               <settings itemId="9215" minDrop="1" maxDrop="1" chance="1000000" enchant="5-10" enchantChance="100"/>
11
+       </drops>
12
+</list>
13
\ No newline at end of file
14
diff --git a/aCis_gameserver/config/players.properties b/aCis_gameserver/config/players.properties
15
index 809b980..6c6515e 100644
16
--- a/aCis_gameserver/config/players.properties
17
+++ b/aCis_gameserver/config/players.properties
18
@@ -73,6 +72,9 @@
19
 # Configure messages that players will receive. Variables: $player for player name; $days for days; $npc for npc name.
20
 HeroMsg = Congratulations $player you received $days days of HERO for murdering the boss $npc.
21
 
22
+# Enable Custom Drops, configure in data/xml/monstersDrops.xml
23
+MonsterDrops = True
24
+
25
 #=============================================================
26
 #                        Aio System
27
 #=============================================================
28
diff --git a/aCis_gameserver/java/net/sf/l2j/Config.java b/aCis_gameserver/java/net/sf/l2j/Config.java
29
index 782e7c3..ec42ff4 100644
30
--- a/aCis_gameserver/java/net/sf/l2j/Config.java
31
+++ b/aCis_gameserver/java/net/sf/l2j/Config.java
32
@@ -473,12 +473,13 @@
33
        public static List<Integer> RAIDBOSS_NOBLES = new ArrayList<>();
34
        public static int BANKING_SYSTEM_ADENA;
35
        public static IntIntHolder[] BANKING_SYSTEM_GOLDCOIN;
36
        public static IntIntHolder[] PVP_COLORS;
37
        public static IntIntHolder[] KILL_RAID_HERO;
38
        public static String KILL_HERO_MSG;
39
        public static IntIntHolder[] KILL_RAID_VIP;
40
        public static String KILL_VIP_MSG;
41
+       public static boolean MONSTERS_DROPS;
42
       
43
        /** Aio */
44
        public static int AIO_COLOR;
45
@@ -1308,10 +1309,14 @@
46
               
47
                for (String skill_id : players.getProperty("RaidBossId", "").split(";"))
48
                        RAIDBOSS_NOBLES.add(Integer.parseInt(skill_id));
49
+              
50
+               MONSTERS_DROPS = players.getProperty("MonsterDrops", false);
51
+              
52
                BANKING_SYSTEM_GOLDCOIN = players.parseIntIntList("BankingGoldCoin", "9209-1");
53
                BANKING_SYSTEM_ADENA = players.getProperty("BankingAdenaCount", 500000000);
54
               
55
                PVP_COLORS = players.parseIntIntList("PvpColors", "10-99050");
56
               
57
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java b/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
58
index 150e4c5..520b05c 100644
59
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
60
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
61
@@ -58,7 +58,7 @@
62
 import net.sf.l2j.gameserver.data.xml.ArmorSetData;
63
 import net.sf.l2j.gameserver.data.xml.AugmentationData;
64
 import net.sf.l2j.gameserver.data.xml.DoorData;
65
-import net.sf.l2j.gameserver.data.xml.DropsData;
66
+import net.sf.l2j.gameserver.data.xml.DropMonstersData;
67
 import net.sf.l2j.gameserver.data.xml.EnchantData;
68
 import net.sf.l2j.gameserver.data.xml.FishData;
69
 import net.sf.l2j.gameserver.data.xml.HennaData;
70
@@ -243,15 +243,12 @@
71
                StringUtil.printSection("Manor Manager");
72
                CastleManorManager.getInstance();
73
               
74
+               StringUtil.printSection("Drop Monsters");
75
+               DropMonstersData.getInstance();
76
+              
77
                StringUtil.printSection("NPCs");
78
                BufferManager.getInstance();
79
                HerbDropData.getInstance();
80
-              
81
                NpcData.getInstance();
82
                WalkerRouteData.getInstance();
83
                DoorData.getInstance().spawn();
84
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/data/xml/DropMonstersData.java b/aCis_gameserver/java/net/sf/l2j/gameserver/data/xml/DropMonstersData.java
85
new file mode 100644
86
index 0000000..66b5292
87
--- /dev/null
88
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/data/xml/DropMonstersData.java
89
@@ -0,0 +1,65 @@
90
+package net.sf.l2j.gameserver.data.xml;
91
+
92
+import java.nio.file.Path;
93
+import java.util.HashMap;
94
+import java.util.Map;
95
+
96
+import net.sf.l2j.commons.data.xml.IXmlReader;
97
+import net.sf.l2j.commons.util.StatsSet;
98
+
99
+import net.sf.l2j.gameserver.model.DropMonsters;
100
+
101
+import org.w3c.dom.Document;
102
+
103
+/**
104
+ * @author Williams
105
+ *
106
+ */
107
+public class DropMonstersData implements IXmlReader
108
+{
109
+       private final Map<Integer, DropMonsters> _data = new HashMap<>();
110
+      
111
+       public DropMonstersData()
112
+       {
113
+               load();
114
+       }
115
+      
116
+       public void reload()
117
+       {
118
+               _data.clear();
119
+               load();
120
+       }
121
+      
122
+       @Override
123
+       public void load()
124
+       {
125
+               parseFile("./data/xml/monstersDrops.xml");
126
+               LOGGER.info("Loaded {} drop data.", _data.size());
127
+       }
128
+      
129
+       @Override
130
+       public void parseDocument(Document doc, Path path)
131
+       {
132
+               forEach(doc, "list", listNode -> forEach(listNode, "drops", monstersNode ->
133
+               {
134
+                       final StatsSet set = parseAttributes(monstersNode);
135
+                       forEach(monstersNode, "settings", setNode -> set.putAll(parseAttributes(setNode)));
136
+                       _data.put(set.getInteger("npcId"), new DropMonsters(set));
137
+               }));
138
+       }
139
+      
140
+       public DropMonsters getNpcs(int npcId)
141
+       {
142
+               return _data.get(npcId);
143
+       }
144
+      
145
+       public static DropMonstersData getInstance()
146
+       {
147
+               return SingletonHolder.INSTANCE;
148
+       }
149
+      
150
+       private static class SingletonHolder
151
+       {
152
+               protected static final DropMonstersData INSTANCE = new DropMonstersData();
153
+       }
154
+}
155
\ No newline at end of file
156
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/model/DropMonsters.java b/aCis_gameserver/java/net/sf/l2j/gameserver/model/DropMonsters.java
157
new file mode 100644
158
index 0000000..c00d11d
159
--- /dev/null
160
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/model/DropMonsters.java
161
@@ -0,0 +1,67 @@
162
+package net.sf.l2j.gameserver.model;
163
+
164
+import net.sf.l2j.commons.random.Rnd;
165
+import net.sf.l2j.commons.util.StatsSet;
166
+
167
+import net.sf.l2j.gameserver.model.holder.IntIntHolder;
168
+
169
+/**
170
+ * @author Williams
171
+ *
172
+ */
173
+public class DropMonsters
174
+{
175
+       private int _itemId;
176
+       private int _minDrop;
177
+       private int _maxDrop;
178
+       private int _chance;
179
+      
180
+       private final IntIntHolder _enchant;
181
+       private final int _enchantChance;
182
+      
183
+       public DropMonsters(StatsSet set)
184
+       {
185
+               _itemId = set.getInteger("itemId");
186
+               _minDrop = set.getInteger("minDrop");
187
+               _maxDrop = set.getInteger("maxDrop");
188
+               _chance = set.getInteger("chance");
189
+              
190
+               _enchant = set.getString("enchant", "").isEmpty() ? null : set.getIntIntHolder("enchant");
191
+               _enchantChance = set.getInteger("enchantChance", 0);
192
+       }
193
+      
194
+       public int getMinDrop()
195
+       {
196
+               return _minDrop;
197
+       }
198
+      
199
+       public int getMaxDrop()
200
+       {
201
+               return _maxDrop;
202
+       }
203
+      
204
+       public int getChance()
205
+       {
206
+               return _chance;
207
+       }
208
+      
209
+       public int getItemId()
210
+       {
211
+               return _itemId;
212
+       }
213
+      
214
+       public int getEnchant()
215
+       {
216
+               return Rnd.get(Math.min(_enchant.getId(), _enchant.getValue()), Math.max(_enchant.getId(), _enchant.getValue()));
217
+       }
218
+      
219
+       public int getEnchantChance()
220
+       {
221
+               return _enchantChance;
222
+       }
223
+      
224
+       public boolean hasEnchant()
225
+       {
226
+               return _enchant != null;
227
+       }
228
+}
229
\ No newline at end of file
230
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/Monster.java b/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/Monster.java
231
index fa7ed64..fce5b0d 100644
232
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/Monster.java
233
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/Monster.java
234
@@ -12,8 +12,9 @@
235
 
236
 import net.sf.l2j.Config;
237
 import net.sf.l2j.gameserver.data.manager.CursedWeaponManager;
238
+import net.sf.l2j.gameserver.data.xml.DropMonstersData;
239
 import net.sf.l2j.gameserver.data.xml.HerbDropData;
240
+import net.sf.l2j.gameserver.model.DropMonsters;
241
 import net.sf.l2j.gameserver.model.L2Skill;
242
 import net.sf.l2j.gameserver.model.actor.Attackable;
243
 import net.sf.l2j.gameserver.model.actor.Creature;
244
@@ -1153,6 +1155,37 @@
245
                        }
246
                }
247
               
248
+               if (Config.MONSTERS_DROPS)
249
+               {
250
+                       final DropMonsters monsters = DropMonstersData.getInstance().getNpcs(npcTemplate.getNpcId());
251
+                       if (monsters == null)
252
+                               return;
253
+                      
254
+                       int dropChance = monsters.getChance();
255
+                      
256
+                       // Apply level modifier, if any/wanted.
257
+                       if (Config.DEEPBLUE_DROP_RULES)
258
+                       {
259
+                               int deepBlueDrop = (levelModifier > 0) ? 3 : 1;
260
+                              
261
+                               // Check if we should apply our maths so deep blue mobs will not drop that easy.
262
+                               dropChance = ((monsters.getChance() - ((monsters.getChance() * levelModifier) / 100)) / deepBlueDrop);
263
+                       }
264
+                      
265
+                       if (Config.AUTO_LOOT)
266
+                       {
267
+                               if (Rnd.get(1, 100) < dropChance)
268
+                               {
269
+                                       final ItemInstance item = player.addItem("", monsters.getItemId(), Rnd.get(monsters.getMinDrop(), monsters.getMaxDrop()), player, true);
270
+                                       if (item.getItem().getType1() == Item.TYPE1_WEAPON_RING_EARRING_NECKLACE || item.getItem().getType1() == Item.TYPE1_SHIELD_ARMOR)
271
+                                       {
272
+                                               if (monsters.hasEnchant() && Rnd.get(1, 100) < monsters.getEnchantChance())
273
+                                                       item.setEnchantLevel(monsters.getEnchant());
274
+                                       }
275
+                               }
276
+                       }
277
+               }
278
+              
279
                // Apply special item drop for champions.
280
                if (isChampion() && Config.CHAMPION_REWARD > 0)
281
                {