Cleaned up NpcTemplate a bit.
Index: dist/game/data/scripts/handlers/bypasshandlers/NpcViewMod.java
===================================================================
--- dist/game/data/scripts/handlers/bypasshandlers/NpcViewMod.java (revision 12883)
+++ dist/game/data/scripts/handlers/bypasshandlers/NpcViewMod.java (working copy)
@@ -38,6 +38,7 @@
import org.l2jmobius.gameserver.model.holders.DropGroupHolder;
import org.l2jmobius.gameserver.model.holders.DropHolder;
import org.l2jmobius.gameserver.model.item.ItemTemplate;
+import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
import org.l2jmobius.gameserver.util.HtmlUtil;
import org.l2jmobius.gameserver.util.Util;
@@ -300,6 +301,10 @@
final DecimalFormat chanceFormat = new DecimalFormat("0.00##");
int leftHeight = 0;
int rightHeight = 0;
+ final double dropAmountAdenaEffectBonus = player.getStat().getBonusDropAdenaMultiplier();
+ final double dropAmountEffectBonus = player.getStat().getBonusDropAmountMultiplier();
+ final double dropRateEffectBonus = player.getStat().getBonusDropRateMultiplier();
+ final double spoilRateEffectBonus = player.getStat().getBonusSpoilRateMultiplier();
final StringBuilder leftSb = new StringBuilder();
final StringBuilder rightSb = new StringBuilder();
String limitReachedMsg = "";
@@ -324,6 +329,9 @@
rateChance *= Config.PREMIUM_RATE_SPOIL_CHANCE;
rateAmount *= Config.PREMIUM_RATE_SPOIL_AMOUNT;
}
+
+ // bonus spoil rate effect
+ rateChance *= spoilRateEffectBonus;
}
else
{
@@ -398,6 +406,15 @@
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT;
}
}
+
+ // bonus drop amount effect
+ rateAmount *= dropAmountEffectBonus;
+ if (item.getId() == Inventory.ADENA_ID)
+ {
+ rateAmount *= dropAmountAdenaEffectBonus;
+ }
+ // bonus drop rate effect
+ rateChance *= dropRateEffectBonus;
}
sb.append("<table width=332 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
Index: dist/game/data/scripts/handlers/communityboard/DropSearchBoard.java
===================================================================
--- dist/game/data/scripts/handlers/communityboard/DropSearchBoard.java (revision 12883)
+++ dist/game/data/scripts/handlers/communityboard/DropSearchBoard.java (working copy)
@@ -179,6 +179,10 @@
final int start = (page - 1) * 14;
final int end = Math.min(list.size() - 1, start + 14);
final StringBuilder builder = new StringBuilder();
+ final double dropAmountAdenaEffectBonus = player.getStat().getBonusDropAdenaMultiplier();
+ final double dropAmountEffectBonus = player.getStat().getBonusDropAmountMultiplier();
+ final double dropRateEffectBonus = player.getStat().getBonusDropRateMultiplier();
+ final double spoilRateEffectBonus = player.getStat().getBonusSpoilRateMultiplier();
for (int index = start; index <= end; index++)
{
final CBDropHolder cbDropHolder = list.get(index);
@@ -197,6 +201,9 @@
rateChance *= Config.PREMIUM_RATE_SPOIL_CHANCE;
rateAmount *= Config.PREMIUM_RATE_SPOIL_AMOUNT;
}
+
+ // bonus spoil rate effect
+ rateChance *= spoilRateEffectBonus;
}
else
{
@@ -272,6 +279,15 @@
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT;
}
}
+
+ // bonus drop amount effect
+ rateAmount *= dropAmountEffectBonus;
+ if (item.getId() == Inventory.ADENA_ID)
+ {
+ rateAmount *= dropAmountAdenaEffectBonus;
+ }
+ // bonus drop rate effect
+ rateChance *= dropRateEffectBonus;
}
builder.append("<tr>");
Index: dist/game/data/stats/skills/08400-08499.xml
===================================================================
--- dist/game/data/stats/skills/08400-08499.xml (revision 12883)
+++ dist/game/data/stats/skills/08400-08499.xml (working copy)
@@ -427,10 +427,16 @@
</skill>
<skill id="8415" levels="5" name="Ring Ability - Drop Rate Up">
<!-- Increases item drop rate. -->
+ <table name="#bonusDropRate">10 20 30 40 50</table>
<set name="icon" val="icon.skill3080" />
<set name="magicLevel" val="85" />
<set name="operateType" val="P" />
- <set name="targetType" val="NONE" />
+ <set name="targetType" val="SELF" />
+ <for>
+ <effect name="Buff">
+ <add stat="bonusDropRate" val="#bonusDropRate" />
+ </effect>
+ </for>
</skill>
<skill id="8416" levels="5" name="Earring Ability - Drop Rate Up">
<!-- Increases item drop rate. -->
Index: dist/game/data/xsd/skills.xsd
===================================================================
--- dist/game/data/xsd/skills.xsd (revision 12883)
+++ dist/game/data/xsd/skills.xsd (working copy)
@@ -413,9 +413,13 @@
<xs:enumeration value="waterPower" />
<xs:enumeration value="windPower" />
<xs:enumeration value="firePower" />
- <xs:enumeration value="bonusSp" />
<xs:enumeration value="defCritRateAdd" />
<xs:enumeration value="bonusExp" />
+ <xs:enumeration value="bonusSp" />
+ <xs:enumeration value="bonusDropAdena" />
+ <xs:enumeration value="bonusDropAmount" />
+ <xs:enumeration value="bonusDropRate" />
+ <xs:enumeration value="bonusSpoilRate" />
<xs:enumeration value="pvePhysDmg" />
<xs:enumeration value="pvePhysSkillsDmg" />
<xs:enumeration value="pveBowDmg" />
Index: java/org/l2jmobius/gameserver/model/actor/stat/PlayerStat.java
===================================================================
--- java/org/l2jmobius/gameserver/model/actor/stat/PlayerStat.java (revision 12883)
+++ java/org/l2jmobius/gameserver/model/actor/stat/PlayerStat.java (working copy)
@@ -944,4 +944,24 @@
return bonus;
}
+
+ public double getBonusDropAdenaMultiplier()
+ {
+ return 1 + (calcStat(Stat.BONUS_DROP_ADENA, 0, null, null) / 100);
+ }
+
+ public double getBonusDropAmountMultiplier()
+ {
+ return 1 + (calcStat(Stat.BONUS_DROP_AMOUNT, 0, null, null) / 100);
+ }
+
+ public double getBonusDropRateMultiplier()
+ {
+ return 1 + (calcStat(Stat.BONUS_DROP_RATE, 0, null, null) / 100);
+ }
+
+ public double getBonusSpoilRateMultiplier()
+ {
+ return 1 + (calcStat(Stat.BONUS_SPOIL_RATE, 0, null, null) / 100);
+ }
}
Index: java/org/l2jmobius/gameserver/model/actor/templates/NpcTemplate.java
===================================================================
--- java/org/l2jmobius/gameserver/model/actor/templates/NpcTemplate.java (revision 12883)
+++ java/org/l2jmobius/gameserver/model/actor/templates/NpcTemplate.java (working copy)
@@ -34,6 +34,7 @@
import org.l2jmobius.gameserver.enums.Sex;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature;
+import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.holders.DropGroupHolder;
import org.l2jmobius.gameserver.model.holders.DropHolder;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
@@ -700,6 +701,7 @@
int dropOccurrenceCounter = victim.isRaid() ? Config.DROP_MAX_OCCURRENCES_RAIDBOSS : Config.DROP_MAX_OCCURRENCES_NORMAL;
if (dropOccurrenceCounter > 0)
{
+ final Player player = killer.getActingPlayer();
List<ItemHolder> randomDrops = null;
ItemHolder cachedItem = null;
double totalChance; // total group chance is 100
@@ -736,24 +738,30 @@
}
// premium chance
- if (Config.PREMIUM_SYSTEM_ENABLED && (killer.getActingPlayer() != null) && killer.getActingPlayer().hasPremiumStatus())
+ if (player != null)
{
- if (Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(itemId) != null)
+ if (Config.PREMIUM_SYSTEM_ENABLED && player.hasPremiumStatus())
{
- rateChance *= Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(itemId);
+ if (Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(itemId) != null)
+ {
+ rateChance *= Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(itemId);
+ }
+ else if (item.hasExImmediateEffect())
+ {
+ // TODO: Premium herb chance? :)
+ }
+ else if (victim.isRaid())
+ {
+ // TODO: Premium raid chance? :)
+ }
+ else
+ {
+ rateChance *= Config.PREMIUM_RATE_DROP_CHANCE;
+ }
}
- else if (item.hasExImmediateEffect())
- {
- // TODO: Premium herb chance? :)
- }
- else if (victim.isRaid())
- {
- // TODO: Premium raid chance? :)
- }
- else
- {
- rateChance *= Config.PREMIUM_RATE_DROP_CHANCE;
- }
+
+ // bonus drop rate effect
+ rateChance *= player.getStat().getBonusDropRateMultiplier();
}
// only use total chance on x1, custom rates break this logic because total chance is more than 100%
@@ -1022,24 +1030,35 @@
}
// premium amount
- if (Config.PREMIUM_SYSTEM_ENABLED && (killer.getActingPlayer() != null) && killer.getActingPlayer().hasPremiumStatus())
+ final Player player = killer.getActingPlayer();
+ if (player != null)
{
- if (Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(itemId) != null)
+ if (Config.PREMIUM_SYSTEM_ENABLED && player.hasPremiumStatus())
{
- rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(itemId);
+ if (Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(itemId) != null)
+ {
+ rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(itemId);
+ }
+ else if (item.hasExImmediateEffect())
+ {
+ // TODO: Premium herb amount? :)
+ }
+ else if (victim.isRaid())
+ {
+ // TODO: Premium raid amount? :)
+ }
+ else
+ {
+ rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT;
+ }
}
- else if (item.hasExImmediateEffect())
+
+ // bonus drop amount effect
+ rateAmount *= player.getStat().getBonusDropAmountMultiplier();
+ if (itemId == Inventory.ADENA_ID)
{
- // TODO: Premium herb amount? :)
+ rateAmount *= player.getStat().getBonusDropAdenaMultiplier();
}
- else if (victim.isRaid())
- {
- // TODO: Premium raid amount? :)
- }
- else
- {
- rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT;
- }
}
// finally
@@ -1089,24 +1108,31 @@
}
// premium chance
- if (Config.PREMIUM_SYSTEM_ENABLED && (killer.getActingPlayer() != null) && killer.getActingPlayer().hasPremiumStatus())
+ final Player player = killer.getActingPlayer();
+ if (player != null)
{
- if (Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(itemId) != null)
+ if (Config.PREMIUM_SYSTEM_ENABLED && player.hasPremiumStatus())
{
- rateChance *= Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(itemId);
+ if (Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(itemId) != null)
+ {
+ rateChance *= Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(itemId);
+ }
+ else if (item.hasExImmediateEffect())
+ {
+ // TODO: Premium herb chance? :)
+ }
+ else if (victim.isRaid())
+ {
+ // TODO: Premium raid chance? :)
+ }
+ else
+ {
+ rateChance *= Config.PREMIUM_RATE_DROP_CHANCE;
+ }
}
- else if (item.hasExImmediateEffect())
- {
- // TODO: Premium herb chance? :)
- }
- else if (victim.isRaid())
- {
- // TODO: Premium raid chance? :)
- }
- else
- {
- rateChance *= Config.PREMIUM_RATE_DROP_CHANCE;
- }
+
+ // bonus drop rate effect
+ rateChance *= player.getStat().getBonusDropRateMultiplier();
}
// calculate if item will drop
@@ -1136,24 +1162,34 @@
}
// premium amount
- if (Config.PREMIUM_SYSTEM_ENABLED && (killer.getActingPlayer() != null) && killer.getActingPlayer().hasPremiumStatus())
+ if (player != null)
{
- if (Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(itemId) != null)
+ if (Config.PREMIUM_SYSTEM_ENABLED && player.hasPremiumStatus())
{
- rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(itemId);
+ if (Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(itemId) != null)
+ {
+ rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(itemId);
+ }
+ else if (item.hasExImmediateEffect())
+ {
+ // TODO: Premium herb amount? :)
+ }
+ else if (victim.isRaid())
+ {
+ // TODO: Premium raid amount? :)
+ }
+ else
+ {
+ rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT;
+ }
}
- else if (item.hasExImmediateEffect())
+
+ // bonus drop amount effect
+ rateAmount *= player.getStat().getBonusDropAmountMultiplier();
+ if (itemId == Inventory.ADENA_ID)
{
- // TODO: Premium herb amount? :)
+ rateAmount *= player.getStat().getBonusDropAdenaMultiplier();
}
- else if (victim.isRaid())
- {
- // TODO: Premium raid amount? :)
- }
- else
- {
- rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT;
- }
}
// finally
@@ -1166,9 +1202,16 @@
// chance
double rateChance = Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER;
// premium chance
- if (Config.PREMIUM_SYSTEM_ENABLED && (killer.getActingPlayer() != null) && killer.getActingPlayer().hasPremiumStatus())
+ final Player player = killer.getActingPlayer();
+ if (player != null)
{
- rateChance *= Config.PREMIUM_RATE_SPOIL_CHANCE;
+ if (Config.PREMIUM_SYSTEM_ENABLED && player.hasPremiumStatus())
+ {
+ rateChance *= Config.PREMIUM_RATE_SPOIL_CHANCE;
+ }
+
+ // bonus spoil rate effect
+ rateChance *= player.getStat().getBonusSpoilRateMultiplier();
}
// calculate if item will be rewarded
@@ -1177,7 +1220,7 @@
// amount is calculated after chance returned success
double rateAmount = Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER;
// premium amount
- if (Config.PREMIUM_SYSTEM_ENABLED && (killer.getActingPlayer() != null) && killer.getActingPlayer().hasPremiumStatus())
+ if (Config.PREMIUM_SYSTEM_ENABLED && (player != null) && player.hasPremiumStatus())
{
rateAmount *= Config.PREMIUM_RATE_SPOIL_AMOUNT;
}
Index: java/org/l2jmobius/gameserver/model/stats/Stat.java
===================================================================
--- java/org/l2jmobius/gameserver/model/stats/Stat.java (revision 12883)
+++ java/org/l2jmobius/gameserver/model/stats/Stat.java (working copy)
@@ -88,6 +88,10 @@
EXPSP_RATE("rExp"),
BONUS_EXP("bonusExp"),
BONUS_SP("bonusSp"),
+ BONUS_DROP_ADENA("bonusDropAdena"),
+ BONUS_DROP_AMOUNT("bonusDropAmount"),
+ BONUS_DROP_RATE("bonusDropRate"),
+ BONUS_SPOIL_RATE("bonusSpoilRate"),
ATTACK_CANCEL("cancel"),
// ACCURACY & RANGE