SHOW:
|
|
- or go back to the newest paste.
1 | ### Eclipse Workspace Patch 1.0 | |
2 | #P aCis_gameserver | |
3 | Index: java/net/sf/l2j/gameserver/model/actor/template/NpcTemplate.java | |
4 | =================================================================== | |
5 | --- java/net/sf/l2j/gameserver/model/actor/template/NpcTemplate.java (revision 20) | |
6 | +++ java/net/sf/l2j/gameserver/model/actor/template/NpcTemplate.java (working copy) | |
7 | @@ -34,6 +34,7 @@ | |
8 | private boolean _usingServerSideName; | |
9 | private final String _title; | |
10 | private boolean _usingServerSideTitle; | |
11 | + private final boolean _cantBeChampionMonster; | |
12 | private final byte _level; | |
13 | private final int _exp; | |
14 | private final int _sp; | |
15 | @@ -81,6 +82,7 @@ | |
16 | _usingServerSideName = set.getBool("usingServerSideName", false); | |
17 | _title = set.getString("title", ""); | |
18 | _usingServerSideTitle = set.getBool("usingServerSideTitle", false); | |
19 | + _cantBeChampionMonster = _title.equalsIgnoreCase("Quest Monster") || isType("Chest"); | |
20 | _level = set.getByte("level", (byte) 1); | |
21 | _exp = set.getInteger("exp", 0); | |
22 | _sp = set.getInteger("sp", 0); | |
23 | @@ -195,6 +197,11 @@ | |
24 | return _usingServerSideTitle; | |
25 | } | |
26 | ||
27 | + public boolean cantBeChampion() | |
28 | + { | |
29 | + return _cantBeChampionMonster; | |
30 | + } | |
31 | + | |
32 | public byte getLevel() | |
33 | { | |
34 | return _level; | |
35 | Index: java/net/sf/l2j/gameserver/network/serverpackets/AbstractNpcInfo.java | |
36 | =================================================================== | |
37 | --- java/net/sf/l2j/gameserver/network/serverpackets/AbstractNpcInfo.java (revision 20) | |
38 | +++ java/net/sf/l2j/gameserver/network/serverpackets/AbstractNpcInfo.java (working copy) | |
39 | @@ -99,7 +99,9 @@ | |
40 | if (_npc.getTemplate().isUsingServerSideName()) | |
41 | _name = _npc.getName(); | |
42 | ||
43 | - if (_npc.getTemplate().isUsingServerSideTitle()) | |
44 | + if (_npc.isChampion()) | |
45 | + _title = "Champion"; | |
46 | + else if (_npc.getTemplate().isUsingServerSideTitle()) | |
47 | _title = _npc.getTitle(); | |
48 | ||
49 | if (Config.SHOW_NPC_LVL && _npc instanceof Monster) | |
50 | Index: config/npcs.properties | |
51 | =================================================================== | |
52 | --- config/npcs.properties (revision 20) | |
53 | +++ config/npcs.properties (working copy) | |
54 | @@ -1,4 +1,42 @@ | |
55 | #============================================================= | |
56 | +# Champion mobs | |
57 | +#============================================================= | |
58 | + | |
59 | +# Chance for a mob to became champion (in percent) - 0 to disable | |
60 | +ChampionFrequency = 0 | |
61 | + | |
62 | +# Min and max lvl allowed for a mob to be champion. | |
63 | +ChampionMinLevel = 20 | |
64 | +ChampionMaxLevel = 70 | |
65 | + | |
66 | +# Hp multiplier | |
67 | +ChampionHp = 8 | |
68 | + | |
69 | +# Hp Regen Multiplier | |
70 | +ChampionHpRegen = 1. | |
71 | + | |
72 | +# Rewards multiplier | |
73 | +ChampionRewards = 8 | |
74 | + | |
75 | +# Adenas & seal stones rewards multiplier | |
76 | +ChampionAdenasRewards = 1 | |
77 | + | |
78 | +# Atk bonus for champion (changes apply on patk & matk) | |
79 | +ChampionAtk = 1. | |
80 | + | |
81 | +# Spd Atk bonus for champion (changes apply on patkspd & matkspd) | |
82 | +ChampionSpdAtk = 1. | |
83 | + | |
84 | +# Chance to obtain a specified reward item from a higher lvl champion (in percents) default is off using glittering medal as reward | |
85 | +ChampionRewardItem = 0 | |
86 | + | |
87 | +# Specified reward item ID | |
88 | +ChampionRewardItemID = 6393 | |
89 | + | |
90 | +# Specified reward item rnd qty | |
91 | +ChampionRewardItemQty = 1 | |
92 | + | |
93 | +#============================================================= | |
94 | # Баффер | |
95 | #============================================================= | |
96 | # Максимальное количество доступных схем на игрока. | |
97 | Index: java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminManage.java | |
98 | =================================================================== | |
99 | --- java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminManage.java (revision 20) | |
100 | +++ java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminManage.java (working copy) | |
101 | @@ -4,6 +4,7 @@ | |
102 | ||
103 | import net.sf.l2j.commons.lang.StringUtil; | |
104 | ||
105 | +import net.sf.l2j.Config; | |
106 | import net.sf.l2j.gameserver.handler.IAdminCommandHandler; | |
107 | import net.sf.l2j.gameserver.model.World; | |
108 | import net.sf.l2j.gameserver.model.actor.Creature; | |
109 | @@ -149,7 +150,7 @@ | |
110 | return false; | |
111 | ||
112 | creature.stopAllEffects(); | |
113 | - creature.reduceCurrentHp(creature.getStatus().getMaxHp() + creature.getStatus().getMaxCp() + 1, player, null); | |
114 | + creature.reduceCurrentHp(creature.isChampion() ? creature.getStatus().getMaxHp() * Config.CHAMPION_HP + 1 : creature.getStatus().getMaxHp() + creature.getStatus().getMaxCp() + 1, player, null); | |
115 | return true; | |
116 | } | |
117 | ||
118 | Index: config/en/npcs.properties | |
119 | =================================================================== | |
120 | --- config/en/npcs.properties (revision 20) | |
121 | +++ config/en/npcs.properties (working copy) | |
122 | @@ -1,4 +1,42 @@ | |
123 | #============================================================= | |
124 | +# Champion mobs | |
125 | +#============================================================= | |
126 | + | |
127 | +# Chance for a mob to became champion (in percent) - 0 to disable | |
128 | +ChampionFrequency = 0 | |
129 | + | |
130 | +# Min and max lvl allowed for a mob to be champion. | |
131 | +ChampionMinLevel = 20 | |
132 | +ChampionMaxLevel = 70 | |
133 | + | |
134 | +# Hp multiplier | |
135 | +ChampionHp = 8 | |
136 | + | |
137 | +# Hp Regen Multiplier | |
138 | +ChampionHpRegen = 1. | |
139 | + | |
140 | +# Rewards multiplier | |
141 | +ChampionRewards = 8 | |
142 | + | |
143 | +# Adenas & seal stones rewards multiplier | |
144 | +ChampionAdenasRewards = 1 | |
145 | + | |
146 | +# Atk bonus for champion (changes apply on patk & matk) | |
147 | +ChampionAtk = 1. | |
148 | + | |
149 | +# Spd Atk bonus for champion (changes apply on patkspd & matkspd) | |
150 | +ChampionSpdAtk = 1. | |
151 | + | |
152 | +# Chance to obtain a specified reward item from a higher lvl champion (in percents) default is off using glittering medal as reward | |
153 | +ChampionRewardItem = 0 | |
154 | + | |
155 | +# Specified reward item ID | |
156 | +ChampionRewardItemID = 6393 | |
157 | + | |
158 | +# Specified reward item rnd qty | |
159 | +ChampionRewardItemQty = 1 | |
160 | + | |
161 | +#============================================================= | |
162 | # Buffer | |
163 | #============================================================= | |
164 | ||
165 | Index: java/net/sf/l2j/Config.java | |
166 | =================================================================== | |
167 | --- java/net/sf/l2j/Config.java (revision 20) | |
168 | +++ java/net/sf/l2j/Config.java (working copy) | |
169 | @@ -298,6 +298,20 @@ | |
170 | // NPCs / Monsters | |
171 | // -------------------------------------------------- | |
172 | ||
173 | + /** Champion Mod */ | |
174 | + public static int CHAMPION_FREQUENCY; | |
175 | + public static int CHAMP_MIN_LVL; | |
176 | + public static int CHAMP_MAX_LVL; | |
177 | + public static int CHAMPION_HP; | |
178 | + public static int CHAMPION_REWARDS; | |
179 | + public static int CHAMPION_ADENAS_REWARDS; | |
180 | + public static double CHAMPION_HP_REGEN; | |
181 | + public static double CHAMPION_ATK; | |
182 | + public static double CHAMPION_SPD_ATK; | |
183 | + public static int CHAMPION_REWARD; | |
184 | + public static int CHAMPION_REWARD_ID; | |
185 | + public static int CHAMPION_REWARD_QTY; | |
186 | + | |
187 | /** Buffer */ | |
188 | public static int BUFFER_MAX_SCHEMES; | |
189 | public static int BUFFER_STATIC_BUFF_COST; | |
190 | @@ -1122,6 +1136,19 @@ | |
191 | { | |
192 | final ExProperties npcs = initProperties(NPCS_FILE); | |
193 | ||
194 | + CHAMPION_FREQUENCY = npcs.getProperty("ChampionFrequency", 0); | |
195 | + CHAMP_MIN_LVL = npcs.getProperty("ChampionMinLevel", 20); | |
196 | + CHAMP_MAX_LVL = npcs.getProperty("ChampionMaxLevel", 70); | |
197 | + CHAMPION_HP = npcs.getProperty("ChampionHp", 8); | |
198 | + CHAMPION_HP_REGEN = npcs.getProperty("ChampionHpRegen", 1.); | |
199 | + CHAMPION_REWARDS = npcs.getProperty("ChampionRewards", 8); | |
200 | + CHAMPION_ADENAS_REWARDS = npcs.getProperty("ChampionAdenasRewards", 1); | |
201 | + CHAMPION_ATK = npcs.getProperty("ChampionAtk", 1.); | |
202 | + CHAMPION_SPD_ATK = npcs.getProperty("ChampionSpdAtk", 1.); | |
203 | + CHAMPION_REWARD = npcs.getProperty("ChampionRewardItem", 0); | |
204 | + CHAMPION_REWARD_ID = npcs.getProperty("ChampionRewardItemID", 6393); | |
205 | + CHAMPION_REWARD_QTY = npcs.getProperty("ChampionRewardItemQty", 1); | |
206 | + | |
207 | BUFFER_MAX_SCHEMES = npcs.getProperty("BufferMaxSchemesPerChar", 4); | |
208 | BUFFER_STATIC_BUFF_COST = npcs.getProperty("BufferStaticCostPerBuff", -1); | |
209 | ||
210 | Index: java/net/sf/l2j/gameserver/model/actor/instance/Monster.java | |
211 | =================================================================== | |
212 | --- java/net/sf/l2j/gameserver/model/actor/instance/Monster.java (revision 20) | |
213 | +++ java/net/sf/l2j/gameserver/model/actor/instance/Monster.java (working copy) | |
214 | @@ -65,6 +65,8 @@ | |
215 | private boolean _isRaid; | |
216 | private boolean _isMinion; | |
217 | ||
218 | + private boolean _isChampion; | |
219 | + | |
220 | public Monster(int objectId, NpcTemplate template) | |
221 | { | |
222 | super(objectId, template); | |
223 | @@ -468,6 +470,13 @@ | |
224 | sp = sp * pow; | |
225 | } | |
226 | ||
227 | + // Add champion ratio, if any. | |
228 | + if (isChampion()) | |
229 | + { | |
230 | + xp *= Config.CHAMPION_REWARDS; | |
231 | + sp *= Config.CHAMPION_REWARDS; | |
232 | + } | |
233 | + | |
234 | // If the XP is inferior or equals 0, don't reward any SP. Both XP and SP can't be inferior to 0. | |
235 | if (xp <= 0) | |
236 | { | |
237 | @@ -502,6 +511,17 @@ | |
238 | return _minionList; | |
239 | } | |
240 | ||
241 | + @Override | |
242 | + public final boolean isChampion() | |
243 | + { | |
244 | + return _isChampion; | |
245 | + } | |
246 | + | |
247 | + public final void setChampion(boolean value) | |
248 | + { | |
249 | + _isChampion = value; | |
250 | + } | |
251 | + | |
252 | /** | |
253 | * Teleport this {@link Monster} to its master. | |
254 | */ | |
255 | @@ -565,6 +585,9 @@ | |
256 | else | |
257 | dropChance *= Config.RATE_DROP_ITEMS; | |
258 | ||
259 | + if (isChampion()) | |
260 | + dropChance *= Config.CHAMPION_REWARDS; | |
261 | + | |
262 | // Set our limits for chance of drop | |
263 | if (dropChance < 1) | |
264 | dropChance = 1; | |
265 | @@ -592,6 +615,10 @@ | |
266 | dropChance -= DropData.MAX_CHANCE; | |
267 | } | |
268 | ||
269 | + if (isChampion()) | |
270 | + if (drop.getItemId() == 57 || (drop.getItemId() >= 6360 && drop.getItemId() <= 6362)) | |
271 | + itemCount *= Config.CHAMPION_ADENAS_REWARDS; | |
272 | + | |
273 | if (itemCount > 0) | |
274 | return new IntIntHolder(drop.getItemId(), itemCount); | |
275 | ||
276 | @@ -634,6 +661,9 @@ | |
277 | else | |
278 | categoryDropChance *= Config.RATE_DROP_ITEMS; | |
279 | ||
280 | + if (isChampion()) | |
281 | + categoryDropChance *= Config.CHAMPION_REWARDS; | |
282 | + | |
283 | // Set our limits for chance of drop | |
284 | if (categoryDropChance < 1) | |
285 | categoryDropChance = 1; | |
286 | @@ -665,6 +695,9 @@ | |
287 | else | |
288 | dropChance *= Config.RATE_DROP_ITEMS; | |
289 | ||
290 | + if (isChampion()) | |
291 | + dropChance *= Config.CHAMPION_REWARDS; | |
292 | + | |
293 | if (dropChance < DropData.MAX_CHANCE) | |
294 | dropChance = DropData.MAX_CHANCE; | |
295 | ||
296 | @@ -691,6 +724,10 @@ | |
297 | dropChance -= DropData.MAX_CHANCE; | |
298 | } | |
299 | ||
300 | + if (isChampion()) | |
301 | + if (drop.getItemId() == 57 || (drop.getItemId() >= 6360 && drop.getItemId() <= 6362)) | |
302 | + itemCount *= Config.CHAMPION_ADENAS_REWARDS; | |
303 | + | |
304 | if (itemCount > 0) | |
305 | return new IntIntHolder(drop.getItemId(), itemCount); | |
306 | } | |
307 | @@ -887,6 +924,30 @@ | |
308 | } | |
309 | } | |
310 | ||
311 | + // Apply special item drop for champions. | |
312 | + if (isChampion() && Config.CHAMPION_REWARD > 0) | |
313 | + { | |
314 | + int dropChance = Config.CHAMPION_REWARD; | |
315 | + | |
316 | + // Apply level modifier, if any/wanted. | |
317 | + if (Config.DEEPBLUE_DROP_RULES) | |
318 | + { | |
319 | + int deepBlueDrop = (levelModifier > 0) ? 3 : 1; | |
320 | + | |
321 | + // Check if we should apply our maths so deep blue mobs will not drop that easy. | |
322 | + dropChance = ((Config.CHAMPION_REWARD - ((Config.CHAMPION_REWARD * levelModifier) / 100)) / deepBlueDrop); | |
323 | + } | |
324 | + | |
325 | + if (Rnd.get(100) < dropChance) | |
326 | + { | |
327 | + final IntIntHolder item = new IntIntHolder(Config.CHAMPION_REWARD_ID, Math.max(1, Rnd.get(1, Config.CHAMPION_REWARD_QTY))); | |
328 | + if (Config.AUTO_LOOT) | |
329 | + player.addItem("ChampionLoot", item.getId(), item.getValue(), this, true); | |
330 | + else | |
331 | + dropItem(player, item); | |
332 | + } | |
333 | + } | |
334 | + | |
335 | // Herbs. | |
336 | if (getTemplate().getDropHerbGroup() > 0) | |
337 | { | |
338 | Index: java/net/sf/l2j/gameserver/model/actor/Creature.java | |
339 | =================================================================== | |
340 | --- java/net/sf/l2j/gameserver/model/actor/Creature.java (revision 20) | |
341 | +++ java/net/sf/l2j/gameserver/model/actor/Creature.java (working copy) | |
342 | @@ -1683,8 +1683,16 @@ | |
343 | } | |
344 | ||
345 | public void reduceCurrentHp(double i, Creature attacker, boolean awake, boolean isDOT, L2Skill skill) | |
346 | + { | |
347 | + if (isChampion() && Config.CHAMPION_HP != 0) | |
348 | + getStatus().reduceHp(i / Config.CHAMPION_HP, attacker, awake, isDOT, false); | |
349 | + else | |
350 | + getStatus().reduceHp(i, attacker, awake, isDOT, false); | |
351 | + } | |
352 | + | |
353 | + public boolean isChampion() | |
354 | { | |
355 | - getStatus().reduceHp(i, attacker, awake, isDOT, false); | |
356 | + return false; | |
357 | } | |
358 | ||
359 | /** | |
360 | Index: java/net/sf/l2j/gameserver/model/actor/status/CreatureStatus.java | |
361 | =================================================================== | |
362 | --- java/net/sf/l2j/gameserver/model/actor/status/CreatureStatus.java (revision 20) | |
363 | +++ java/net/sf/l2j/gameserver/model/actor/status/CreatureStatus.java (working copy) | |
364 | @@ -622,7 +622,7 @@ | |
365 | */ | |
366 | public double getRegenHp() | |
367 | { | |
368 | - return calcStat(Stats.REGENERATE_HP_RATE, _actor.getTemplate().getBaseHpRegen(getLevel()) * (_actor.isRaidRelated() ? Config.RAID_HP_REGEN_MULTIPLIER : Config.HP_REGEN_MULTIPLIER), null, null); | |
369 | + return calcStat(Stats.REGENERATE_HP_RATE, _actor.getTemplate().getBaseHpRegen(getLevel()) * (_actor.isRaidRelated() ? Config.RAID_HP_REGEN_MULTIPLIER : Config.HP_REGEN_MULTIPLIER) * ((_actor.isChampion()) ? Config.CHAMPION_HP_REGEN : 1), null, null); | |
370 | } | |
371 | ||
372 | /** | |
373 | @@ -640,7 +640,7 @@ | |
374 | */ | |
375 | public int getMAtk(Creature target, L2Skill skill) | |
376 | { | |
377 | - return (int) calcStat(Stats.MAGIC_ATTACK, _actor.getTemplate().getBaseMAtk(), target, skill); | |
378 | + return (int) calcStat(Stats.MAGIC_ATTACK, _actor.getTemplate().getBaseMAtk() * ((_actor.isChampion()) ? Config.CHAMPION_ATK : 1), target, skill); | |
379 | } | |
380 | ||
381 | /** | |
382 | @@ -648,7 +648,7 @@ | |
383 | */ | |
384 | public int getMAtkSpd() | |
385 | { | |
386 | - return (int) calcStat(Stats.MAGIC_ATTACK_SPEED, 333.0, null, null); | |
387 | + return (int) calcStat(Stats.MAGIC_ATTACK_SPEED, 333.0 * ((_actor.isChampion()) ? Config.CHAMPION_SPD_ATK : 1), null, null); | |
388 | } | |
389 | ||
390 | /** | |
391 | @@ -668,7 +668,7 @@ | |
392 | */ | |
393 | public int getPAtk(Creature target) | |
394 | { | |
395 | - return (int) calcStat(Stats.POWER_ATTACK, _actor.getTemplate().getBasePAtk(), target, null); | |
396 | + return (int) calcStat(Stats.POWER_ATTACK, _actor.getTemplate().getBasePAtk() * ((_actor.isChampion()) ? Config.CHAMPION_ATK : 1), target, null); | |
397 | } | |
398 | ||
399 | /** | |
400 | @@ -676,7 +676,7 @@ | |
401 | */ | |
402 | public int getPAtkSpd() | |
403 | { | |
404 | - return (int) calcStat(Stats.POWER_ATTACK_SPEED, _actor.getTemplate().getBasePAtkSpd(), null, null); | |
405 | + return (int) calcStat(Stats.POWER_ATTACK_SPEED, _actor.getTemplate().getBasePAtkSpd() * ((_actor.isChampion()) ? Config.CHAMPION_SPD_ATK : 1), null, null); | |
406 | } | |
407 | ||
408 | /** | |
409 | Index: java/net/sf/l2j/gameserver/model/spawn/Spawn.java | |
410 | =================================================================== | |
411 | --- java/net/sf/l2j/gameserver/model/spawn/Spawn.java (revision 20) | |
412 | +++ java/net/sf/l2j/gameserver/model/spawn/Spawn.java (working copy) | |
413 | @@ -6,6 +6,7 @@ | |
414 | import net.sf.l2j.commons.pool.ThreadPool; | |
415 | import net.sf.l2j.commons.random.Rnd; | |
416 | ||
417 | +import net.sf.l2j.Config; | |
418 | import net.sf.l2j.gameserver.data.xml.NpcData; | |
419 | import net.sf.l2j.gameserver.geoengine.GeoEngine; | |
420 | import net.sf.l2j.gameserver.idfactory.IdFactory; | |
421 | @@ -12,6 +13,7 @@ | |
422 | import net.sf.l2j.gameserver.model.World; | |
423 | import net.sf.l2j.gameserver.model.actor.Creature; | |
424 | import net.sf.l2j.gameserver.model.actor.Npc; | |
425 | +import net.sf.l2j.gameserver.model.actor.instance.Monster; | |
426 | import net.sf.l2j.gameserver.model.actor.template.NpcTemplate; | |
427 | import net.sf.l2j.gameserver.model.location.SpawnLocation; | |
428 | ||
429 | @@ -390,6 +392,14 @@ | |
430 | // Set the HP and MP of the Npc to the max | |
431 | _npc.getStatus().setMaxHpMp(); | |
432 | ||
433 | + // when champion mod is enabled, try to make NPC a champion | |
434 | + if (Config.CHAMPION_FREQUENCY > 0) | |
435 | + { | |
436 | + // It can't be a Raid, a Raid minion nor a minion. Quest mobs and chests are disabled too. | |
437 | + if (_npc instanceof Monster && !getTemplate().cantBeChampion() && _npc.getStatus().getLevel() >= Config.CHAMP_MIN_LVL && _npc.getStatus().getLevel() <= Config.CHAMP_MAX_LVL && !_npc.isRaidRelated() && !_npc.isMinion()) | |
438 | + ((Monster) _npc).setChampion(Rnd.get(100) < Config.CHAMPION_FREQUENCY); | |
439 | + } | |
440 | + | |
441 | // spawn NPC on new coordinates | |
442 | _npc.spawnMe(locX, locY, locZ, (_loc.getHeading() < 0) ? Rnd.get(65536) : _loc.getHeading()); | |
443 | } | |
444 |