Drops rework.
This commit is contained in:
parent
2c61857b12
commit
fc94704b2d
@ -1,10 +0,0 @@
|
||||
# ---------------------------------------------------------------------------
|
||||
# Old Drop Behavior
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# Enables L2J old drop behavior
|
||||
# The old L2J system used to add amount of items drop per 100% range of chance.
|
||||
# For example, if chance is 230% when rate are applied, it will do :
|
||||
# amount dropped = (2 * getRandomAmount(min,max)) + 30% chance to get ad additional getRandomAmount(min,max)
|
||||
# Default : False
|
||||
OldDropBehavior = False
|
@ -225,11 +225,6 @@ OrderQuestListByQuestId = True
|
||||
# Default: False
|
||||
AutoDeleteInvalidQuestData = False
|
||||
|
||||
# If True, allows a special handling for drops when chance raises over 100% (eg. when applying chance rates).
|
||||
# True value causes better drop handling at higher rates.
|
||||
# Default: True
|
||||
PreciseDropCalculation = True
|
||||
|
||||
# Allow creating multiple non-stackable items at one time?
|
||||
# Default: True
|
||||
MultipleItemDrop = True
|
||||
|
30
L2J_Mobius_1.0_Ertheia/dist/game/config/NPC.ini
vendored
30
L2J_Mobius_1.0_Ertheia/dist/game/config/NPC.ini
vendored
@ -174,36 +174,6 @@ GrandChaosTime = 10
|
||||
MinionChaosTime = 10
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Drops
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# The min and max level difference used for level gap calculation
|
||||
# this is only for how many levels higher the player is than the monster
|
||||
# Default: 8
|
||||
DropAdenaMinLevelDifference = 8
|
||||
# Default: 15
|
||||
DropAdenaMaxLevelDifference = 15
|
||||
|
||||
# This is the minimum level gap chance meaning for 10 that the monster will have 10% chance
|
||||
# to allow dropping the item if level difference is bigger than DropAdenaMaxLevelDifference
|
||||
# Note: This value is scalling from 100 to the specified value for DropAdenaMinLevelDifference to DropAdenaMaxLevelDifference limits
|
||||
# Default: 10
|
||||
DropAdenaMinLevelGapChance = 10
|
||||
|
||||
# The min and max level difference used for level gap calculation
|
||||
# this is only for how many levels higher the player is than the monster
|
||||
# Default: 5
|
||||
DropItemMinLevelDifference = 5
|
||||
# Default: 10
|
||||
DropItemMaxLevelDifference = 10
|
||||
|
||||
# This is the minimum level gap chance meaning for 10 that the monster will have 10% chance
|
||||
# to allow dropping the item if level difference is bigger than DropAdenaMaxLevelDifference
|
||||
# Note: This value is scalling from 100 to the specified value for DropAdenaMinLevelDifference to DropAdenaMaxLevelDifference limits
|
||||
# Default: 10
|
||||
DropItemMinLevelGapChance = 10
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Vitality
|
||||
# ---------------------------------------------------------------------------
|
||||
|
@ -5,39 +5,6 @@
|
||||
# Warning:
|
||||
# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Item Rates
|
||||
# ---------------------------------------------------------------------------
|
||||
# Warning: to achieve old l2j behavior before drops rework you need to enable OldDropBehavior in Custom.ini
|
||||
# and increase only chance multipliers! Remember if you increase both chance and amount you will have higher rates than expected
|
||||
# Example: if amount multiplier is 5 and chance multiplier is 5 you will end up with 5*5 = 25 drop rates so be careful!
|
||||
|
||||
# Multiplies the amount of items dropped from monster on ground when it dies.
|
||||
DeathDropAmountMultiplier = 1
|
||||
# Multiplies the amount of items looted from monster when a skill like Sweeper(Spoil) is used.
|
||||
CorpseDropAmountMultiplier = 1
|
||||
# Multiplies the amount of items dropped from monster on ground when it dies.
|
||||
HerbDropAmountMultiplier = 1
|
||||
RaidDropAmountMultiplier = 1
|
||||
|
||||
# Multiplies the chance of items that can be dropped from monster on ground when it dies.
|
||||
DeathDropChanceMultiplier = 1
|
||||
# Multiplies the chance of items that can be looted from monster when a skill like Sweeper(Spoil) is used.
|
||||
CorpseDropChanceMultiplier = 1
|
||||
# Multiplies the chance of items that can be dropped from monster on ground when it dies.
|
||||
HerbDropChanceMultiplier = 1
|
||||
RaidDropChanceMultiplier = 1
|
||||
|
||||
# List of items affected by custom drop rate by id, used now for Adena rate too.
|
||||
# Usage: itemId1,multiplier1;itemId2,multiplier2;...
|
||||
# Note: Make sure the lists do NOT CONTAIN trailing spaces or spaces between the numbers!
|
||||
# Example for Raid boss 1x jewelry: 6656,1;6657,1;6658,1;6659,1;6660,1;6661,1;6662,1;8191,1;10170,1;10314,1;
|
||||
# Default: 57,1
|
||||
DropAmountMultiplierByItemId = 57,1
|
||||
DropChanceMultiplierByItemId = 57,1
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Standard Settings (Retail value = 1)
|
||||
# ---------------------------------------------------------------------------
|
||||
@ -109,6 +76,68 @@ RateQuestRewardRecipe = 1
|
||||
RateQuestRewardMaterial = 1
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Item Drop Rates
|
||||
# ---------------------------------------------------------------------------
|
||||
# Remember if you increase both chance and amount you will have higher rates than expected.
|
||||
# Example: if amount multiplier is 5 and chance multiplier is 5 you will end up with 5*5 = 25 drop rates so be careful!
|
||||
|
||||
# Multiplies the amount of items rewarded from monsters when they die.
|
||||
DeathDropAmountMultiplier = 1
|
||||
# Multiplies the amount of items rewarded from monsters when a Spoil skill is used.
|
||||
SpoilDropAmountMultiplier = 1
|
||||
# Multiplies the amount of items rewarded from monsters when they die.
|
||||
HerbDropAmountMultiplier = 1
|
||||
RaidDropAmountMultiplier = 1
|
||||
|
||||
# Multiplies the chance of items that can be rewarded from monsters when they die.
|
||||
DeathDropChanceMultiplier = 1
|
||||
# Multiplies the chance of items that can be rewarded from monsters when a Spoil skill is used.
|
||||
SpoilDropChanceMultiplier = 1
|
||||
# Multiplies the chance of items that can be rewarded from monsters when they die.
|
||||
HerbDropChanceMultiplier = 1
|
||||
RaidDropChanceMultiplier = 1
|
||||
|
||||
# List of items affected by custom drop rate by id, used now for Adena rate too.
|
||||
# Usage: itemId1,multiplier1;itemId2,multiplier2;...
|
||||
# Note: Make sure the lists do NOT CONTAIN trailing spaces or spaces between the numbers!
|
||||
# Example for Raid boss 1x jewelry: 6656,1;6657,1;6658,1;6659,1;6660,1;6661,1;6662,1;8191,1;10170,1;10314,1;
|
||||
# Default: 57,1
|
||||
DropAmountMultiplierByItemId = 57,1
|
||||
DropChanceMultiplierByItemId = 57,1
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Item Drop Level Difference Settings
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# The min and max level difference used for level gap calculation
|
||||
# this is only for how many levels higher the player is than the monster
|
||||
# Default: 8
|
||||
DropAdenaMinLevelDifference = 8
|
||||
# Default: 15
|
||||
DropAdenaMaxLevelDifference = 15
|
||||
|
||||
# This is the minimum level gap chance meaning for 10 that the monster will have 10% chance
|
||||
# to allow dropping the item if level difference is bigger than DropAdenaMaxLevelDifference
|
||||
# Note: This value is scalling from 100 to the specified value for DropAdenaMinLevelDifference to DropAdenaMaxLevelDifference limits
|
||||
# Default: 10
|
||||
DropAdenaMinLevelGapChance = 10
|
||||
|
||||
# The min and max level difference used for level gap calculation
|
||||
# this is only for how many levels higher the player is than the monster
|
||||
# Default: 5
|
||||
DropItemMinLevelDifference = 5
|
||||
# Default: 10
|
||||
DropItemMaxLevelDifference = 10
|
||||
|
||||
# This is the minimum level gap chance meaning for 10 that the monster will have 10% chance
|
||||
# to allow dropping the item if level difference is bigger than DropAdenaMaxLevelDifference
|
||||
# Note: This value is scalling from 100 to the specified value for DropAdenaMinLevelDifference to DropAdenaMaxLevelDifference limits
|
||||
# Default: 10
|
||||
DropItemMinLevelGapChance = 10
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Vitality system rates. Works only if EnableVitality = True
|
||||
# ---------------------------------------------------------------------------
|
||||
|
@ -265,7 +265,7 @@ public class AdminAdmin implements IAdminCommandHandler
|
||||
}
|
||||
case "RateDropSpoil":
|
||||
{
|
||||
Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER = Float.valueOf(pValue);
|
||||
Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER = Float.valueOf(pValue);
|
||||
break;
|
||||
}
|
||||
case "EnchantChanceElementStone":
|
||||
@ -462,7 +462,7 @@ public class AdminAdmin implements IAdminCommandHandler
|
||||
replyMSG.append("<tr><td><font color=\"00AA00\">Drop:</font></td><td></td><td></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"LEVEL\">Rate EXP</font> = " + Config.RATE_XP + "</td><td><edit var=\"param1\" width=40 height=15></td><td><button value=\"Set\" action=\"bypass -h admin_setconfig RateXp $param1\" width=40 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"LEVEL\">Rate SP</font> = " + Config.RATE_SP + "</td><td><edit var=\"param2\" width=40 height=15></td><td><button value=\"Set\" action=\"bypass -h admin_setconfig RateSp $param2\" width=40 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"LEVEL\">Rate Drop Spoil</font> = " + Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER + "</td><td><edit var=\"param4\" width=40 height=15></td><td><button value=\"Set\" action=\"bypass -h admin_setconfig RateDropSpoil $param4\" width=40 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"LEVEL\">Rate Drop Spoil</font> = " + Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER + "</td><td><edit var=\"param4\" width=40 height=15></td><td><button value=\"Set\" action=\"bypass -h admin_setconfig RateDropSpoil $param4\" width=40 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
replyMSG.append("<tr><td width=140></td><td width=40></td><td width=40></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"00AA00\">Enchant:</font></td><td></td><td></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"LEVEL\">Enchant Element Stone</font> = " + Config.ENCHANT_CHANCE_ELEMENT_STONE + "</td><td><edit var=\"param8\" width=40 height=15></td><td><button value=\"Set\" action=\"bypass -h admin_setconfig EnchantChanceElementStone $param8\" width=40 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
|
@ -18,14 +18,15 @@ package handlers.bypasshandlers;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
import com.l2jmobius.commons.util.CommonUtil;
|
||||
import com.l2jmobius.gameserver.cache.HtmCache;
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.enums.AttributeType;
|
||||
import com.l2jmobius.gameserver.enums.DropType;
|
||||
import com.l2jmobius.gameserver.handler.IBypassHandler;
|
||||
import com.l2jmobius.gameserver.model.L2Object;
|
||||
import com.l2jmobius.gameserver.model.L2Spawn;
|
||||
@ -34,10 +35,7 @@ import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.drops.DropListScope;
|
||||
import com.l2jmobius.gameserver.model.drops.GeneralDropItem;
|
||||
import com.l2jmobius.gameserver.model.drops.GroupedGeneralDropItem;
|
||||
import com.l2jmobius.gameserver.model.drops.IDropItem;
|
||||
import com.l2jmobius.gameserver.model.holders.DropHolder;
|
||||
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
|
||||
import com.l2jmobius.gameserver.util.HtmlUtil;
|
||||
@ -106,10 +104,10 @@ public class NpcViewMod implements IBypassHandler
|
||||
return false;
|
||||
}
|
||||
|
||||
final String dropListScopeString = st.nextToken();
|
||||
final String dropListTypeString = st.nextToken();
|
||||
try
|
||||
{
|
||||
final DropListScope dropListScope = Enum.valueOf(DropListScope.class, dropListScopeString);
|
||||
final DropType dropListType = Enum.valueOf(DropType.class, dropListTypeString);
|
||||
final L2Object target = L2World.getInstance().findObject(Integer.parseInt(st.nextToken()));
|
||||
final L2Npc npc = target instanceof L2Npc ? (L2Npc) target : null;
|
||||
if (npc == null)
|
||||
@ -117,7 +115,7 @@ public class NpcViewMod implements IBypassHandler
|
||||
return false;
|
||||
}
|
||||
final int page = st.hasMoreElements() ? Integer.parseInt(st.nextToken()) : 0;
|
||||
sendNpcDropList(activeChar, npc, dropListScope, page);
|
||||
sendNpcDropList(activeChar, npc, dropListType, page);
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
@ -125,7 +123,7 @@ public class NpcViewMod implements IBypassHandler
|
||||
}
|
||||
catch (IllegalArgumentException e)
|
||||
{
|
||||
_log.warning("Bypass[NpcViewMod] unknown drop list scope: " + dropListScopeString);
|
||||
_log.warning("Bypass[NpcViewMod] unknown drop list scope: " + dropListTypeString);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
@ -336,21 +334,22 @@ public class NpcViewMod implements IBypassHandler
|
||||
activeChar.sendPacket(html);
|
||||
}
|
||||
|
||||
public static String getDropListButtons(L2Npc npc)
|
||||
private static String getDropListButtons(L2Npc npc)
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final Map<DropListScope, List<IDropItem>> dropLists = npc.getTemplate().getDropLists();
|
||||
if ((dropLists != null) && !dropLists.isEmpty() && (dropLists.containsKey(DropListScope.DEATH) || dropLists.containsKey(DropListScope.CORPSE)))
|
||||
final List<DropHolder> dropListDeath = npc.getTemplate().getDropList(DropType.DROP);
|
||||
final List<DropHolder> dropListSpoil = npc.getTemplate().getDropList(DropType.SPOIL);
|
||||
if ((dropListDeath != null) || (dropListSpoil != null))
|
||||
{
|
||||
sb.append("<table width=275 cellpadding=0 cellspacing=0><tr>");
|
||||
if (dropLists.containsKey(DropListScope.DEATH))
|
||||
if (dropListDeath != null)
|
||||
{
|
||||
sb.append("<td align=center><button value=\"Show Drop\" width=100 height=25 action=\"bypass NpcViewMod dropList DEATH " + npc.getObjectId() + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
sb.append("<td align=center><button value=\"Show Drop\" width=100 height=25 action=\"bypass NpcViewMod dropList DROP " + npc.getObjectId() + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
}
|
||||
|
||||
if (dropLists.containsKey(DropListScope.CORPSE))
|
||||
if (dropListSpoil != null)
|
||||
{
|
||||
sb.append("<td align=center><button value=\"Show Spoil\" width=100 height=25 action=\"bypass NpcViewMod dropList CORPSE " + npc.getObjectId() + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
sb.append("<td align=center><button value=\"Show Spoil\" width=100 height=25 action=\"bypass NpcViewMod dropList SPOIL " + npc.getObjectId() + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
}
|
||||
|
||||
sb.append("</tr></table>");
|
||||
@ -358,10 +357,10 @@ public class NpcViewMod implements IBypassHandler
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static void sendNpcDropList(L2PcInstance activeChar, L2Npc npc, DropListScope dropListScope, int page)
|
||||
private static void sendNpcDropList(L2PcInstance activeChar, L2Npc npc, DropType dropType, int page)
|
||||
{
|
||||
final List<IDropItem> dropList = npc.getTemplate().getDropList(dropListScope);
|
||||
if ((dropList == null) || dropList.isEmpty())
|
||||
final List<DropHolder> dropList = npc.getTemplate().getDropList(dropType);
|
||||
if (dropList == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -378,7 +377,7 @@ public class NpcViewMod implements IBypassHandler
|
||||
pagesSb.append("<table><tr>");
|
||||
for (int i = 0; i < pages; i++)
|
||||
{
|
||||
pagesSb.append("<td align=center><button value=\"" + (i + 1) + "\" width=20 height=20 action=\"bypass NpcViewMod dropList " + dropListScope + " " + npc.getObjectId() + " " + i + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
pagesSb.append("<td align=center><button value=\"" + (i + 1) + "\" width=20 height=20 action=\"bypass NpcViewMod dropList " + dropType + " " + npc.getObjectId() + " " + i + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
}
|
||||
pagesSb.append("</tr></table>");
|
||||
}
|
||||
@ -409,124 +408,126 @@ public class NpcViewMod implements IBypassHandler
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
|
||||
int height = 64;
|
||||
final IDropItem dropItem = dropList.get(i);
|
||||
if (dropItem instanceof GeneralDropItem)
|
||||
final DropHolder dropItem = dropList.get(i);
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(dropItem.getItemId());
|
||||
|
||||
// real time server rate calculations
|
||||
double rateChance = 1;
|
||||
double rateAmount = 1;
|
||||
if (dropType == DropType.SPOIL)
|
||||
{
|
||||
final GeneralDropItem generalDropItem = (GeneralDropItem) dropItem;
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(generalDropItem.getItemId());
|
||||
sb.append("<table width=332 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
|
||||
sb.append("<tr><td width=32 valign=top>");
|
||||
sb.append("<img src=\"" + item.getIcon() + "\" width=32 height=32>");
|
||||
sb.append("</td><td fixwidth=300 align=center><font name=\"hs9\" color=\"CD9000\">");
|
||||
sb.append(item.getName());
|
||||
sb.append("</font></td></tr><tr><td width=32></td><td width=300><table width=295 cellpadding=0 cellspacing=0>");
|
||||
sb.append("<tr><td width=48 align=right valign=top><font color=\"LEVEL\">Amount:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
rateChance = Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER;
|
||||
rateAmount = Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER;
|
||||
|
||||
final long min = generalDropItem.getMin(npc, activeChar);
|
||||
final long max = generalDropItem.getMax(npc, activeChar);
|
||||
if (min == max)
|
||||
// also check premium rates if available
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && activeChar.hasPremiumStatus())
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
rateChance *= Config.PREMIUM_RATE_SPOIL_CHANCE;
|
||||
rateAmount *= Config.PREMIUM_RATE_SPOIL_AMOUNT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Config.RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
rateChance *= Config.RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
rateChance *= Config.RATE_HERB_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else if (npc.isRaid())
|
||||
{
|
||||
rateChance *= Config.RATE_RAID_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
sb.append(" - ");
|
||||
sb.append(amountFormat.format(max));
|
||||
rateChance *= Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
|
||||
sb.append("</td></tr><tr><td width=48 align=right valign=top><font color=\"LEVEL\">Chance:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
sb.append(chanceFormat.format(Math.min(generalDropItem.getChance(npc, activeChar), 100)));
|
||||
sb.append("%</td></tr></table></td></tr><tr><td width=32></td><td width=300> </td></tr></table>");
|
||||
}
|
||||
else if (dropItem instanceof GroupedGeneralDropItem)
|
||||
{
|
||||
final GroupedGeneralDropItem generalGroupedDropItem = (GroupedGeneralDropItem) dropItem;
|
||||
if (generalGroupedDropItem.getItems().size() == 1)
|
||||
if (Config.RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
final GeneralDropItem generalDropItem = generalGroupedDropItem.getItems().get(0);
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(generalDropItem.getItemId());
|
||||
sb.append("<table width=332 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
|
||||
sb.append("<tr><td width=32 valign=top>");
|
||||
sb.append("<img src=\"" + item.getIcon() + "\" width=32 height=32>");
|
||||
sb.append("</td><td fixwidth=300 align=center><font name=\"hs9\" color=\"CD9000\">");
|
||||
sb.append(item.getName());
|
||||
sb.append("</font></td></tr><tr><td width=32></td><td width=300><table width=295 cellpadding=0 cellspacing=0>");
|
||||
sb.append("<tr><td width=48 align=right valign=top><font color=\"LEVEL\">Amount:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
|
||||
final long min = generalDropItem.getMin(npc, activeChar);
|
||||
final long max = generalDropItem.getMax(npc, activeChar);
|
||||
if (min == max)
|
||||
rateAmount *= Config.RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
rateAmount *= Config.RATE_HERB_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else if (npc.isRaid())
|
||||
{
|
||||
rateAmount *= Config.RATE_RAID_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
rateAmount *= Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
|
||||
// also check premium rates if available
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && activeChar.hasPremiumStatus())
|
||||
{
|
||||
if (Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
rateChance *= Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
// TODO: Premium herb chance? :)
|
||||
}
|
||||
else if (npc.isRaid())
|
||||
{
|
||||
// TODO: Premium raid chance? :)
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
sb.append(" - ");
|
||||
sb.append(amountFormat.format(max));
|
||||
rateChance *= Config.PREMIUM_RATE_DROP_CHANCE;
|
||||
}
|
||||
|
||||
sb.append("</td></tr><tr><td width=48 align=right valign=top><font color=\"LEVEL\">Chance:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
sb.append(chanceFormat.format(Math.min(generalGroupedDropItem.getChance(npc, activeChar), 100)));
|
||||
sb.append("%</td></tr></table></td></tr><tr><td width=32></td><td width=300> </td></tr></table>");
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append("<table width=332 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
|
||||
sb.append("<tr><td width=32 valign=top><img src=\"L2UI_CT1.ICON_DF_premiumItem\" width=32 height=32></td>");
|
||||
sb.append("<td fixwidth=300 align=center><font name=\"ScreenMessageSmall\" color=\"CD9000\">One from group</font>");
|
||||
sb.append("</td></tr><tr><td width=32></td><td width=300><table width=295 cellpadding=0 cellspacing=0><tr>");
|
||||
sb.append("<td width=48 align=right valign=top><font color=\"LEVEL\">Chance:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
sb.append(chanceFormat.format(Math.min(generalGroupedDropItem.getChance(npc, activeChar), 100)));
|
||||
sb.append("%</td></tr></table><br>");
|
||||
|
||||
for (GeneralDropItem generalDropItem : generalGroupedDropItem.getItems())
|
||||
if (Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(generalDropItem.getItemId());
|
||||
sb.append("<table width=291 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
|
||||
sb.append("<tr><td width=32 valign=top>");
|
||||
String icon = item.getIcon();
|
||||
if (icon == null)
|
||||
{
|
||||
icon = "icon.etc_question_mark_i00";
|
||||
}
|
||||
sb.append("<img src=\"" + icon + "\" width=32 height=32>");
|
||||
sb.append("</td><td fixwidth=259 align=center><font name=\"hs9\" color=\"CD9000\">");
|
||||
sb.append(item.getName());
|
||||
sb.append("</font></td></tr><tr><td width=32></td><td width=259><table width=253 cellpadding=0 cellspacing=0>");
|
||||
sb.append("<tr><td width=48 align=right valign=top><font color=\"LEVEL\">Amount:</font></td><td width=205 align=center>");
|
||||
|
||||
final long min = generalDropItem.getMin(npc, activeChar);
|
||||
final long max = generalDropItem.getMax(npc, activeChar);
|
||||
if (min == max)
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
sb.append(" - ");
|
||||
sb.append(amountFormat.format(max));
|
||||
}
|
||||
|
||||
sb.append("</td></tr><tr><td width=48 align=right valign=top><font color=\"LEVEL\">Chance:</font></td>");
|
||||
sb.append("<td width=205 align=center>");
|
||||
sb.append(chanceFormat.format(Math.min(generalDropItem.getChance(npc, activeChar), 100)));
|
||||
sb.append("%</td></tr></table></td></tr><tr><td width=32></td><td width=259> </td></tr></table>");
|
||||
|
||||
height += 64;
|
||||
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
// TODO: Premium herb amount? :)
|
||||
}
|
||||
else if (npc.isRaid())
|
||||
{
|
||||
// TODO: Premium raid amount? :)
|
||||
}
|
||||
else
|
||||
{
|
||||
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT;
|
||||
}
|
||||
|
||||
sb.append("</td></tr><tr><td width=32></td><td width=300> </td></tr></table>");
|
||||
}
|
||||
}
|
||||
|
||||
sb.append("<table width=332 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
|
||||
sb.append("<tr><td width=32 valign=top>");
|
||||
sb.append("<img src=\"" + (item.getIcon() == null ? "icon.etc_question_mark_i00" : item.getIcon()) + "\" width=32 height=32>");
|
||||
sb.append("</td><td fixwidth=300 align=center><font name=\"hs9\" color=\"CD9000\">");
|
||||
sb.append(item.getName());
|
||||
sb.append("</font></td></tr><tr><td width=32></td><td width=300><table width=295 cellpadding=0 cellspacing=0>");
|
||||
sb.append("<tr><td width=48 align=right valign=top><font color=\"LEVEL\">Amount:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
|
||||
final long min = (long) (dropItem.getMin() * rateAmount);
|
||||
final long max = (long) (dropItem.getMax() * rateAmount);
|
||||
if (min == max)
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
sb.append(" - ");
|
||||
sb.append(amountFormat.format(max));
|
||||
}
|
||||
|
||||
sb.append("</td></tr><tr><td width=48 align=right valign=top><font color=\"LEVEL\">Chance:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
sb.append(chanceFormat.format(Math.min((long) dropItem.getChance() * rateChance, 100)));
|
||||
sb.append("%</td></tr></table></td></tr><tr><td width=32></td><td width=300> </td></tr></table>");
|
||||
|
||||
if ((sb.length() + rightSb.length() + leftSb.length()) < 16000) // limit of 32766?
|
||||
{
|
||||
if (leftHeight >= (rightHeight + height))
|
||||
|
@ -22,23 +22,21 @@ import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.StringJoiner;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
import com.l2jmobius.commons.util.Rnd;
|
||||
import com.l2jmobius.gameserver.cache.HtmCache;
|
||||
import com.l2jmobius.gameserver.data.xml.impl.NpcData;
|
||||
import com.l2jmobius.gameserver.data.xml.impl.SpawnsData;
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.enums.DropType;
|
||||
import com.l2jmobius.gameserver.handler.CommunityBoardHandler;
|
||||
import com.l2jmobius.gameserver.handler.IParseBoardHandler;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.actor.templates.L2NpcTemplate;
|
||||
import com.l2jmobius.gameserver.model.drops.DropListScope;
|
||||
import com.l2jmobius.gameserver.model.drops.GeneralDropItem;
|
||||
import com.l2jmobius.gameserver.model.drops.GroupedGeneralDropItem;
|
||||
import com.l2jmobius.gameserver.model.drops.IDropItem;
|
||||
import com.l2jmobius.gameserver.model.holders.DropHolder;
|
||||
import com.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
|
||||
@ -56,40 +54,40 @@ public class DropSearchBoard implements IParseBoardHandler
|
||||
"_bbs_npc_trace"
|
||||
};
|
||||
|
||||
class DropHolder
|
||||
class CBDropHolder
|
||||
{
|
||||
int itemId;
|
||||
int npcId;
|
||||
byte npcLevel;
|
||||
long basemin;
|
||||
long basemax;
|
||||
double baseGroupChance;
|
||||
double basechance;
|
||||
boolean isSweep;
|
||||
long min;
|
||||
long max;
|
||||
double chance;
|
||||
boolean isSpoil;
|
||||
boolean isRaid;
|
||||
|
||||
public DropHolder(L2NpcTemplate npc, GeneralDropItem item, double groupChance, boolean isSweep)
|
||||
public CBDropHolder(L2NpcTemplate npcTemplate, DropHolder dropHolder)
|
||||
{
|
||||
itemId = item.getItemId();
|
||||
npcId = npc.getId();
|
||||
npcLevel = npc.getLevel();
|
||||
basemin = item.getMin();
|
||||
basemax = item.getMax();
|
||||
baseGroupChance = groupChance;
|
||||
basechance = item.getChance();
|
||||
this.isSweep = isSweep;
|
||||
isSpoil = dropHolder.getDropType() == DropType.SPOIL;
|
||||
itemId = dropHolder.getItemId();
|
||||
npcId = npcTemplate.getId();
|
||||
npcLevel = npcTemplate.getLevel();
|
||||
min = dropHolder.getMin();
|
||||
max = dropHolder.getMax();
|
||||
chance = dropHolder.getChance();
|
||||
isRaid = npcTemplate.getType().equals("L2RaidBoss") || npcTemplate.getType().equals("L2GrandBoss");
|
||||
}
|
||||
|
||||
/**
|
||||
* only for debug'/;
|
||||
* only for debug
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "DropHolder [itemId=" + itemId + ", npcId=" + npcId + ", npcLevel=" + npcLevel + ", basemin=" + basemin + ", basemax=" + basemax + ", baseGroupChance=" + baseGroupChance + ", basechance=" + basechance + ", isSweep=" + isSweep + "]";
|
||||
return "DropHolder [itemId=" + itemId + ", npcId=" + npcId + ", npcLevel=" + npcLevel + ", min=" + min + ", max=" + max + ", chance=" + chance + ", isSpoil=" + isSpoil + "]";
|
||||
}
|
||||
}
|
||||
|
||||
private final Map<Integer, List<DropHolder>> DROP_INDEX_CACHE = new HashMap<>();
|
||||
private final Map<Integer, List<CBDropHolder>> DROP_INDEX_CACHE = new HashMap<>();
|
||||
|
||||
// nonsupport items
|
||||
private final Set<Integer> BLOCK_ID = new HashSet<>();
|
||||
@ -104,44 +102,39 @@ public class DropSearchBoard implements IParseBoardHandler
|
||||
|
||||
private void buildDropIndex()
|
||||
{
|
||||
NpcData.getInstance().getTemplates(npc -> npc.getDropLists() != null).forEach(npcTemplate ->
|
||||
NpcData.getInstance().getTemplates(npc -> npc.getDropList(DropType.DROP) != null).forEach(npcTemplate ->
|
||||
{
|
||||
for (Entry<DropListScope, List<IDropItem>> entry : npcTemplate.getDropLists().entrySet())
|
||||
for (DropHolder dropHolder : npcTemplate.getDropList(DropType.DROP))
|
||||
{
|
||||
entry.getValue().forEach(idrop ->
|
||||
{
|
||||
if (idrop instanceof GroupedGeneralDropItem)
|
||||
{
|
||||
GroupedGeneralDropItem ggd = (GroupedGeneralDropItem) idrop;
|
||||
ggd.getItems().stream().forEach(gd -> addToDropList(npcTemplate, gd, ggd.getChance(), entry.getKey() == DropListScope.CORPSE));
|
||||
}
|
||||
else
|
||||
{
|
||||
GeneralDropItem gd = (GeneralDropItem) idrop;
|
||||
addToDropList(npcTemplate, gd, 100.0, entry.getKey() == DropListScope.CORPSE);
|
||||
}
|
||||
});
|
||||
addToDropList(npcTemplate, dropHolder);
|
||||
}
|
||||
});
|
||||
NpcData.getInstance().getTemplates(npc -> npc.getDropList(DropType.SPOIL) != null).forEach(npcTemplate ->
|
||||
{
|
||||
for (DropHolder dropHolder : npcTemplate.getDropList(DropType.SPOIL))
|
||||
{
|
||||
addToDropList(npcTemplate, dropHolder);
|
||||
}
|
||||
});
|
||||
|
||||
DROP_INDEX_CACHE.values().stream().forEach(l -> l.sort((d1, d2) -> Byte.valueOf(d1.npcLevel).compareTo(Byte.valueOf(d2.npcLevel))));
|
||||
}
|
||||
|
||||
private void addToDropList(L2NpcTemplate npcTemplate, GeneralDropItem gd, double groupChance, boolean isSweep)
|
||||
private void addToDropList(L2NpcTemplate npcTemplate, DropHolder dropHolder)
|
||||
{
|
||||
if (BLOCK_ID.contains(gd.getItemId()))
|
||||
if (BLOCK_ID.contains(dropHolder.getItemId()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
List<DropHolder> dropList = DROP_INDEX_CACHE.get(gd.getItemId());
|
||||
List<CBDropHolder> dropList = DROP_INDEX_CACHE.get(dropHolder.getItemId());
|
||||
if (dropList == null)
|
||||
{
|
||||
dropList = new ArrayList<>();
|
||||
DROP_INDEX_CACHE.put(gd.getItemId(), dropList);
|
||||
DROP_INDEX_CACHE.put(dropHolder.getItemId(), dropList);
|
||||
}
|
||||
|
||||
dropList.add(new DropHolder(npcTemplate, gd, groupChance, isSweep));
|
||||
dropList.add(new CBDropHolder(npcTemplate, dropHolder));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -164,7 +157,7 @@ public class DropSearchBoard implements IParseBoardHandler
|
||||
final DecimalFormat chanceFormat = new DecimalFormat("0.00##");
|
||||
int itemId = Integer.parseInt(params[1]);
|
||||
int page = Integer.parseInt(params[2]);
|
||||
List<DropHolder> list = DROP_INDEX_CACHE.get(itemId);
|
||||
List<CBDropHolder> list = DROP_INDEX_CACHE.get(itemId);
|
||||
int pages = list.size() / 14;
|
||||
if (pages == 0)
|
||||
{
|
||||
@ -176,13 +169,106 @@ public class DropSearchBoard implements IParseBoardHandler
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (int index = start; index <= end; index++)
|
||||
{
|
||||
DropHolder dropHolder = list.get(index);
|
||||
CBDropHolder cbDropHolder = list.get(index);
|
||||
|
||||
// real time server rate calculations
|
||||
double rateChance = 1;
|
||||
double rateAmount = 1;
|
||||
if (cbDropHolder.isSpoil)
|
||||
{
|
||||
rateChance = Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER;
|
||||
rateAmount = Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER;
|
||||
|
||||
// also check premium rates if available
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && player.hasPremiumStatus())
|
||||
{
|
||||
rateChance *= Config.PREMIUM_RATE_SPOIL_CHANCE;
|
||||
rateAmount *= Config.PREMIUM_RATE_SPOIL_AMOUNT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(cbDropHolder.itemId);
|
||||
|
||||
if (Config.RATE_DROP_CHANCE_BY_ID.get(cbDropHolder.itemId) != null)
|
||||
{
|
||||
rateChance *= Config.RATE_DROP_CHANCE_BY_ID.get(cbDropHolder.itemId);
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
rateChance *= Config.RATE_HERB_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else if (cbDropHolder.isRaid)
|
||||
{
|
||||
rateAmount *= Config.RATE_RAID_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
rateChance *= Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
|
||||
if (Config.RATE_DROP_AMOUNT_BY_ID.get(cbDropHolder.itemId) != null)
|
||||
{
|
||||
rateAmount *= Config.RATE_DROP_AMOUNT_BY_ID.get(cbDropHolder.itemId);
|
||||
}
|
||||
else if (cbDropHolder.isRaid)
|
||||
{
|
||||
rateAmount *= Config.RATE_RAID_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
rateAmount *= Config.RATE_HERB_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
rateAmount *= Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
|
||||
// also check premium rates if available
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && player.hasPremiumStatus())
|
||||
{
|
||||
if (Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(cbDropHolder.itemId) != null)
|
||||
{
|
||||
rateChance *= Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(cbDropHolder.itemId);
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
// TODO: Premium herb chance? :)
|
||||
}
|
||||
else if (cbDropHolder.isRaid)
|
||||
{
|
||||
// TODO: Premium raid chance? :)
|
||||
}
|
||||
else
|
||||
{
|
||||
rateChance *= Config.PREMIUM_RATE_DROP_CHANCE;
|
||||
}
|
||||
|
||||
if (Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(cbDropHolder.itemId) != null)
|
||||
{
|
||||
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(cbDropHolder.itemId);
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
// TODO: Premium herb amount? :)
|
||||
}
|
||||
else if (cbDropHolder.isRaid)
|
||||
{
|
||||
// TODO: Premium raid amount? :)
|
||||
}
|
||||
else
|
||||
{
|
||||
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
builder.append("<tr>");
|
||||
builder.append("<td width=30>").append(dropHolder.npcLevel).append("</td>");
|
||||
builder.append("<td width=170>").append("<a action=\"bypass _bbs_npc_trace " + dropHolder.npcId + "\">").append("&@").append(dropHolder.npcId).append(";").append("</a>").append("</td>");
|
||||
builder.append("<td width=80 align=CENTER>").append(dropHolder.basemin).append("-").append(dropHolder.basemax).append("</td>");
|
||||
builder.append("<td width=50 align=CENTER>").append(chanceFormat.format((dropHolder.basechance * dropHolder.baseGroupChance) / 100)).append("%").append("</td>");
|
||||
builder.append("<td width=50 align=CENTER>").append(dropHolder.isSweep ? "Sweep" : "Drop").append("</td>");
|
||||
builder.append("<td width=30>").append(cbDropHolder.npcLevel).append("</td>");
|
||||
builder.append("<td width=170>").append("<a action=\"bypass _bbs_npc_trace " + cbDropHolder.npcId + "\">").append("&@").append(cbDropHolder.npcId).append(";").append("</a>").append("</td>");
|
||||
builder.append("<td width=80 align=CENTER>").append(cbDropHolder.min * rateAmount).append("-").append(cbDropHolder.max * rateAmount).append("</td>");
|
||||
builder.append("<td width=50 align=CENTER>").append(chanceFormat.format(cbDropHolder.chance * rateChance)).append("%").append("</td>");
|
||||
builder.append("<td width=50 align=CENTER>").append(cbDropHolder.isSpoil ? "Spoil" : "Drop").append("</td>");
|
||||
builder.append("</tr>");
|
||||
}
|
||||
|
||||
@ -204,7 +290,7 @@ public class DropSearchBoard implements IParseBoardHandler
|
||||
List<NpcSpawnTemplate> spawnList = SpawnsData.getInstance().getNpcSpawns(npc -> npc.getId() == npcId);
|
||||
if (spawnList.isEmpty())
|
||||
{
|
||||
player.sendMessage("cant find any spawn maybe boss or instance mob");
|
||||
player.sendMessage("Cannot find any spawn. Maybe dropped by a boss or instance monster.");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -49,15 +49,15 @@ public class Premium implements IVoicedCommandHandler
|
||||
html.append("<tr><td>Rate SP: <font color=\"LEVEL\"> x" + Config.RATE_SP + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Drop Chance: <font color=\"LEVEL\"> x" + Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER + "<br1></font></td></tr><br>");
|
||||
html.append("<tr><td>Drop Amount: <font color=\"LEVEL\"> x" + Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER + "<br1></font></td></tr><br>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\"> x" + Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER + "<br1></font></td></tr><br>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\"> x" + Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER + "<br><br></font></td></tr><br>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\"> x" + Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER + "<br1></font></td></tr><br>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\"> x" + Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER + "<br><br></font></td></tr><br>");
|
||||
html.append("<tr><td><center>Premium Info & Rules<br></td></tr>");
|
||||
html.append("<tr><td>Rate XP: <font color=\"LEVEL\"> x" + (Config.RATE_XP * Config.PREMIUM_RATE_XP) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Rate SP: <font color=\"LEVEL\"> x" + (Config.RATE_SP * Config.PREMIUM_RATE_SP) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Drop Chance: <font color=\"LEVEL\"> x" + (Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER * Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_DROP_CHANCE) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Drop Amount: <font color=\"LEVEL\"> x" + (Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_DROP_AMOUNT) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\"> x" + (Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_CHANCE) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\"> x" + (Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_AMOUNT) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\"> x" + (Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_CHANCE) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\"> x" + (Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_AMOUNT) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td> <font color=\"70FFCA\">1. Premium benefits CAN NOT BE TRANSFERED.<br1></font></td></tr>");
|
||||
html.append("<tr><td> <font color=\"70FFCA\">2. Premium does not effect party members.<br1></font></td></tr>");
|
||||
html.append("<tr><td> <font color=\"70FFCA\">3. Premium benefits effect ALL characters in same account.</font></td></tr>");
|
||||
@ -71,8 +71,8 @@ public class Premium implements IVoicedCommandHandler
|
||||
html.append("<tr><td>Rate SP: <font color=\"LEVEL\">x" + (Config.RATE_SP * Config.PREMIUM_RATE_SP) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Drop Chance: <font color=\"LEVEL\">x" + (Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_DROP_CHANCE) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Drop Amount: <font color=\"LEVEL\">x" + (Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_DROP_AMOUNT) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\">x" + (Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_CHANCE) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\">x" + (Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_AMOUNT) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\">x" + (Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_CHANCE) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\">x" + (Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_AMOUNT) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Expires: <font color=\"00A5FF\">" + format.format(endDate) + "</font></td></tr>");
|
||||
html.append("<tr><td>Current Date: <font color=\"70FFCA\">" + format.format(System.currentTimeMillis()) + "<br><br></font></td></tr>");
|
||||
html.append("<tr><td><center>Premium Info & Rules<br></center></td></tr>");
|
||||
|
@ -1,272 +1,236 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd">
|
||||
<npc id="2081" level="82" type="L2Monster" name="Canabion of Plague">
|
||||
<!-- TODO: Must be confirmed -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="100" />
|
||||
<param name="MoveAroundSocial1" value="100" />
|
||||
<param name="MoveAroundSocial2" value="100" />
|
||||
<param name="Skill01_Probablity" value="2000" />
|
||||
<param name="Type" value="0" />
|
||||
<param name="PrivatesNorm" value="2081" />
|
||||
<param name="PrivatesSpA" value="2082" />
|
||||
<param name="PrivatesSpB" value="2083" />
|
||||
<param name="MyMakerName" value="inzone03_2111_80m1" />
|
||||
<param name="SoulShot" value="200" />
|
||||
<param name="SoulShotRate" value="5" />
|
||||
<param name="SpiritShot" value="100" />
|
||||
<param name="SpiritShotRate" value="10" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="Skill01_ID" id="4032" level="8" />
|
||||
<skill name="Debuff" id="5719" level="1" />
|
||||
</parameters>
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="12707" sp="3" />
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="3643" mp="1743" hpRegen="8.5" mpRegen="3" />
|
||||
<attack physical="1055.28566004965" magical="720.623302603812" attackSpeed="253" range="40" type="SWORD" distance="80" width="120" random="10" critical="4" accuracy="5" />
|
||||
<defence physical="349.77477" magical="255.95" />
|
||||
<attribute>
|
||||
<defence fire="20" water="20" wind="20" earth="20" holy="20" dark="20" />
|
||||
</attribute>
|
||||
<speed>
|
||||
<walk ground="8" />
|
||||
<run ground="120" />
|
||||
</speed>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<skill_list>
|
||||
<skill id="4032" level="1" /> <!-- NPC Strike -->
|
||||
<skill id="4416" level="9" /> <!-- Demons -->
|
||||
<skill id="5565" level="1" /> <!-- Expose Weak Point -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
</skill_list>
|
||||
<ai clanHelpRange="200" aggroRange="300">
|
||||
<clan_list>
|
||||
<clan>RIM</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="42">
|
||||
<item id="8600" min="1" max="1" chance="20" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="45" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="35" /> <!-- Superior Herb of Life -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8603" min="1" max="1" chance="10" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="54" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="36" /> <!-- Superior Herb of Mana -->
|
||||
</group>
|
||||
<group chance="25">
|
||||
<item id="8606" min="1" max="1" chance="20" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="20" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="20" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Power -->
|
||||
</group>
|
||||
<group chance="10">
|
||||
<item id="8607" min="1" max="1" chance="50" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="50" /> <!-- Herb of Casting Spd. -->
|
||||
</group>
|
||||
<group chance="1">
|
||||
<item id="8612" min="1" max="1" chance="33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="34" /> <!-- Herb of Recovery -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8611" min="1" max="1" chance="94" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="6" /> <!-- Mysterious Herb -->
|
||||
</group>
|
||||
</death>
|
||||
</drop_lists>
|
||||
<status undying="false" />
|
||||
<collision>
|
||||
<radius normal="9" />
|
||||
<height normal="29" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="2082" level="82" type="L2Monster" name="Canabion of Plague" title="Doppler">
|
||||
<!-- TODO: Must be confirmed -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="160" />
|
||||
<param name="MoveAroundSocial1" value="160" />
|
||||
<param name="MoveAroundSocial2" value="160" />
|
||||
<param name="IsAggressive" value="1" />
|
||||
<param name="Aggressive_Time" value="1" />
|
||||
<param name="Skill01_Probablity" value="3500" />
|
||||
<param name="Type" value="1" />
|
||||
<param name="PrivatesNorm" value="2081" />
|
||||
<param name="PrivatesSpA" value="2082" />
|
||||
<param name="PrivatesSpB" value="2083" />
|
||||
<param name="MyMakerName" value="inzone03_2111_80m1" />
|
||||
<param name="SoulShot" value="200" />
|
||||
<param name="SoulShotRate" value="5" />
|
||||
<param name="SpiritShot" value="100" />
|
||||
<param name="SpiritShotRate" value="10" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="Skill01_ID" id="4032" level="8" />
|
||||
<skill name="Debuff" id="5719" level="1" />
|
||||
</parameters>
|
||||
<race>DEMONIC</race>
|
||||
<sex>FEMALE</sex>
|
||||
<acquire exp="12707" sp="3" />
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="3643" mp="1743" hpRegen="8.5" mpRegen="3" />
|
||||
<attack physical="1055.28566004965" magical="720.623302603812" attackSpeed="253" range="40" type="SWORD" distance="80" width="120" random="10" critical="4" accuracy="5" />
|
||||
<defence physical="349.77477" magical="255.95" />
|
||||
<attribute>
|
||||
<defence fire="20" water="20" wind="20" earth="20" holy="20" dark="20" />
|
||||
</attribute>
|
||||
<speed>
|
||||
<walk ground="10" />
|
||||
<run ground="120" />
|
||||
</speed>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<skill_list>
|
||||
<skill id="4032" level="1" /> <!-- NPC Strike -->
|
||||
<skill id="4416" level="9" /> <!-- Demons -->
|
||||
<skill id="5565" level="1" /> <!-- Expose Weak Point -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
</skill_list>
|
||||
<ai clanHelpRange="200" aggroRange="300">
|
||||
<clan_list>
|
||||
<clan>RIM</clan>
|
||||
<ignore_npc_id>2081</ignore_npc_id>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="42">
|
||||
<item id="8600" min="1" max="1" chance="20" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="45" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="35" /> <!-- Superior Herb of Life -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8603" min="1" max="1" chance="10" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="54" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="36" /> <!-- Superior Herb of Mana -->
|
||||
</group>
|
||||
<group chance="25">
|
||||
<item id="8606" min="1" max="1" chance="20" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="20" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="20" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Power -->
|
||||
</group>
|
||||
<group chance="10">
|
||||
<item id="8607" min="1" max="1" chance="50" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="50" /> <!-- Herb of Casting Spd. -->
|
||||
</group>
|
||||
<group chance="1">
|
||||
<item id="8612" min="1" max="1" chance="33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="34" /> <!-- Herb of Recovery -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8611" min="1" max="1" chance="94" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="6" /> <!-- Mysterious Herb -->
|
||||
</group>
|
||||
</death>
|
||||
</drop_lists>
|
||||
<status undying="false" />
|
||||
<collision>
|
||||
<radius normal="9" />
|
||||
<height normal="31.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="2083" level="83" type="L2Monster" name="Canabion of Plague" title="Void">
|
||||
<!-- TODO: Must be confirmed -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="160" />
|
||||
<param name="MoveAroundSocial1" value="160" />
|
||||
<param name="MoveAroundSocial2" value="160" />
|
||||
<param name="IsAggressive" value="1" />
|
||||
<param name="Aggressive_Time" value="1" />
|
||||
<param name="Skill01_Probablity" value="4500" />
|
||||
<param name="Type" value="2" />
|
||||
<param name="PrivatesNorm" value="2081" />
|
||||
<param name="PrivatesSpA" value="2082" />
|
||||
<param name="PrivatesSpB" value="2083" />
|
||||
<param name="MyMakerName" value="inzone03_2111_80m1" />
|
||||
<param name="SoulShot" value="200" />
|
||||
<param name="SoulShotRate" value="5" />
|
||||
<param name="SpiritShot" value="100" />
|
||||
<param name="SpiritShotRate" value="10" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="Skill01_ID" id="4032" level="8" />
|
||||
<skill name="Buff" id="4340" level="1" />
|
||||
<skill name="Debuff" id="5719" level="1" />
|
||||
</parameters>
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="13020" sp="3" />
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="3835" mp="1777" hpRegen="8.5" mpRegen="3" />
|
||||
<attack physical="1099.42361669366" magical="750.763809564873" attackSpeed="253" range="40" type="SWORD" distance="80" width="120" random="10" critical="4" accuracy="5" />
|
||||
<defence physical="353.86144" magical="258.94045" />
|
||||
<attribute>
|
||||
<defence fire="20" water="20" wind="20" earth="20" holy="20" dark="20" />
|
||||
</attribute>
|
||||
<speed>
|
||||
<walk ground="15" />
|
||||
<run ground="120" />
|
||||
</speed>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<skill_list>
|
||||
<skill id="4032" level="1" /> <!-- NPC Strike -->
|
||||
<skill id="4340" level="1" /> <!-- Ultimate Buff, 2nd -->
|
||||
<skill id="4416" level="9" /> <!-- Demons -->
|
||||
<skill id="5565" level="1" /> <!-- Expose Weak Point -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
</skill_list>
|
||||
<ai clanHelpRange="300" aggroRange="300">
|
||||
<clan_list>
|
||||
<clan>RIM</clan>
|
||||
<ignore_npc_id>2081</ignore_npc_id>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="42">
|
||||
<item id="8600" min="1" max="1" chance="20" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="45" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="35" /> <!-- Superior Herb of Life -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8603" min="1" max="1" chance="10" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="54" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="36" /> <!-- Superior Herb of Mana -->
|
||||
</group>
|
||||
<group chance="25">
|
||||
<item id="8606" min="1" max="1" chance="20" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="20" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="20" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Power -->
|
||||
</group>
|
||||
<group chance="10">
|
||||
<item id="8607" min="1" max="1" chance="50" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="50" /> <!-- Herb of Casting Spd. -->
|
||||
</group>
|
||||
<group chance="1">
|
||||
<item id="8612" min="1" max="1" chance="33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="34" /> <!-- Herb of Recovery -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8611" min="1" max="1" chance="94" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="6" /> <!-- Mysterious Herb -->
|
||||
</group>
|
||||
</death>
|
||||
</drop_lists>
|
||||
<status undying="false" />
|
||||
<collision>
|
||||
<radius normal="10" />
|
||||
<height normal="35" />
|
||||
</collision>
|
||||
</npc>
|
||||
</list>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd">
|
||||
<npc id="2081" level="82" type="L2Monster" name="Canabion of Plague">
|
||||
<!-- TODO: Must be confirmed -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="100" />
|
||||
<param name="MoveAroundSocial1" value="100" />
|
||||
<param name="MoveAroundSocial2" value="100" />
|
||||
<param name="Skill01_Probablity" value="2000" />
|
||||
<param name="Type" value="0" />
|
||||
<param name="PrivatesNorm" value="2081" />
|
||||
<param name="PrivatesSpA" value="2082" />
|
||||
<param name="PrivatesSpB" value="2083" />
|
||||
<param name="MyMakerName" value="inzone03_2111_80m1" />
|
||||
<param name="SoulShot" value="200" />
|
||||
<param name="SoulShotRate" value="5" />
|
||||
<param name="SpiritShot" value="100" />
|
||||
<param name="SpiritShotRate" value="10" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="Skill01_ID" id="4032" level="8" />
|
||||
<skill name="Debuff" id="5719" level="1" />
|
||||
</parameters>
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="12707" sp="3" />
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="3643" mp="1743" hpRegen="8.5" mpRegen="3" />
|
||||
<attack physical="1055.28566004965" magical="720.623302603812" attackSpeed="253" range="40" type="SWORD" distance="80" width="120" random="10" critical="4" accuracy="5" />
|
||||
<defence physical="349.77477" magical="255.95" />
|
||||
<attribute>
|
||||
<defence fire="20" water="20" wind="20" earth="20" holy="20" dark="20" />
|
||||
</attribute>
|
||||
<speed>
|
||||
<walk ground="8" />
|
||||
<run ground="120" />
|
||||
</speed>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<skill_list>
|
||||
<skill id="4032" level="1" /> <!-- NPC Strike -->
|
||||
<skill id="4416" level="9" /> <!-- Demons -->
|
||||
<skill id="5565" level="1" /> <!-- Expose Weak Point -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
</skill_list>
|
||||
<ai clanHelpRange="200" aggroRange="300">
|
||||
<clan_list>
|
||||
<clan>RIM</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<drop>
|
||||
<item id="8600" min="1" max="1" chance="8.4" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="18.9" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="14.7" /> <!-- Superior Herb of Life -->
|
||||
<item id="8603" min="1" max="1" chance="1.1" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="5.94" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="3.96" /> <!-- Superior Herb of Mana -->
|
||||
<item id="8606" min="1" max="1" chance="5" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="5" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="5" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Power -->
|
||||
<item id="8607" min="1" max="1" chance="5" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="5" /> <!-- Herb of Casting Spd. -->
|
||||
<item id="8612" min="1" max="1" chance="0.33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="0.33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="0.34" /> <!-- Herb of Recovery -->
|
||||
<item id="8611" min="1" max="1" chance="10.34" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="0.66" /> <!-- Mysterious Herb -->
|
||||
</drop>
|
||||
</drop_lists>
|
||||
<status undying="false" />
|
||||
<collision>
|
||||
<radius normal="9" />
|
||||
<height normal="29" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="2082" level="82" type="L2Monster" name="Canabion of Plague" title="Doppler">
|
||||
<!-- TODO: Must be confirmed -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="160" />
|
||||
<param name="MoveAroundSocial1" value="160" />
|
||||
<param name="MoveAroundSocial2" value="160" />
|
||||
<param name="IsAggressive" value="1" />
|
||||
<param name="Aggressive_Time" value="1" />
|
||||
<param name="Skill01_Probablity" value="3500" />
|
||||
<param name="Type" value="1" />
|
||||
<param name="PrivatesNorm" value="2081" />
|
||||
<param name="PrivatesSpA" value="2082" />
|
||||
<param name="PrivatesSpB" value="2083" />
|
||||
<param name="MyMakerName" value="inzone03_2111_80m1" />
|
||||
<param name="SoulShot" value="200" />
|
||||
<param name="SoulShotRate" value="5" />
|
||||
<param name="SpiritShot" value="100" />
|
||||
<param name="SpiritShotRate" value="10" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="Skill01_ID" id="4032" level="8" />
|
||||
<skill name="Debuff" id="5719" level="1" />
|
||||
</parameters>
|
||||
<race>DEMONIC</race>
|
||||
<sex>FEMALE</sex>
|
||||
<acquire exp="12707" sp="3" />
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="3643" mp="1743" hpRegen="8.5" mpRegen="3" />
|
||||
<attack physical="1055.28566004965" magical="720.623302603812" attackSpeed="253" range="40" type="SWORD" distance="80" width="120" random="10" critical="4" accuracy="5" />
|
||||
<defence physical="349.77477" magical="255.95" />
|
||||
<attribute>
|
||||
<defence fire="20" water="20" wind="20" earth="20" holy="20" dark="20" />
|
||||
</attribute>
|
||||
<speed>
|
||||
<walk ground="10" />
|
||||
<run ground="120" />
|
||||
</speed>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<skill_list>
|
||||
<skill id="4032" level="1" /> <!-- NPC Strike -->
|
||||
<skill id="4416" level="9" /> <!-- Demons -->
|
||||
<skill id="5565" level="1" /> <!-- Expose Weak Point -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
</skill_list>
|
||||
<ai clanHelpRange="200" aggroRange="300">
|
||||
<clan_list>
|
||||
<clan>RIM</clan>
|
||||
<ignore_npc_id>2081</ignore_npc_id>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<drop>
|
||||
<item id="8600" min="1" max="1" chance="8.4" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="18.9" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="14.7" /> <!-- Superior Herb of Life -->
|
||||
<item id="8603" min="1" max="1" chance="1.1" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="5.94" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="3.96" /> <!-- Superior Herb of Mana -->
|
||||
<item id="8606" min="1" max="1" chance="5" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="5" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="5" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Power -->
|
||||
<item id="8607" min="1" max="1" chance="5" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="5" /> <!-- Herb of Casting Spd. -->
|
||||
<item id="8612" min="1" max="1" chance="0.33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="0.33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="0.34" /> <!-- Herb of Recovery -->
|
||||
<item id="8611" min="1" max="1" chance="10.34" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="0.66" /> <!-- Mysterious Herb -->
|
||||
</drop>
|
||||
</drop_lists>
|
||||
<status undying="false" />
|
||||
<collision>
|
||||
<radius normal="9" />
|
||||
<height normal="31.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="2083" level="83" type="L2Monster" name="Canabion of Plague" title="Void">
|
||||
<!-- TODO: Must be confirmed -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="160" />
|
||||
<param name="MoveAroundSocial1" value="160" />
|
||||
<param name="MoveAroundSocial2" value="160" />
|
||||
<param name="IsAggressive" value="1" />
|
||||
<param name="Aggressive_Time" value="1" />
|
||||
<param name="Skill01_Probablity" value="4500" />
|
||||
<param name="Type" value="2" />
|
||||
<param name="PrivatesNorm" value="2081" />
|
||||
<param name="PrivatesSpA" value="2082" />
|
||||
<param name="PrivatesSpB" value="2083" />
|
||||
<param name="MyMakerName" value="inzone03_2111_80m1" />
|
||||
<param name="SoulShot" value="200" />
|
||||
<param name="SoulShotRate" value="5" />
|
||||
<param name="SpiritShot" value="100" />
|
||||
<param name="SpiritShotRate" value="10" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="Skill01_ID" id="4032" level="8" />
|
||||
<skill name="Buff" id="4340" level="1" />
|
||||
<skill name="Debuff" id="5719" level="1" />
|
||||
</parameters>
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="13020" sp="3" />
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="3835" mp="1777" hpRegen="8.5" mpRegen="3" />
|
||||
<attack physical="1099.42361669366" magical="750.763809564873" attackSpeed="253" range="40" type="SWORD" distance="80" width="120" random="10" critical="4" accuracy="5" />
|
||||
<defence physical="353.86144" magical="258.94045" />
|
||||
<attribute>
|
||||
<defence fire="20" water="20" wind="20" earth="20" holy="20" dark="20" />
|
||||
</attribute>
|
||||
<speed>
|
||||
<walk ground="15" />
|
||||
<run ground="120" />
|
||||
</speed>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<skill_list>
|
||||
<skill id="4032" level="1" /> <!-- NPC Strike -->
|
||||
<skill id="4340" level="1" /> <!-- Ultimate Buff, 2nd -->
|
||||
<skill id="4416" level="9" /> <!-- Demons -->
|
||||
<skill id="5565" level="1" /> <!-- Expose Weak Point -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
</skill_list>
|
||||
<ai clanHelpRange="300" aggroRange="300">
|
||||
<clan_list>
|
||||
<clan>RIM</clan>
|
||||
<ignore_npc_id>2081</ignore_npc_id>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<drop>
|
||||
<item id="8600" min="1" max="1" chance="8.4" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="18.9" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="14.7" /> <!-- Superior Herb of Life -->
|
||||
<item id="8603" min="1" max="1" chance="1.1" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="5.94" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="3.96" /> <!-- Superior Herb of Mana -->
|
||||
<item id="8606" min="1" max="1" chance="5" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="5" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="5" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Power -->
|
||||
<item id="8607" min="1" max="1" chance="5" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="5" /> <!-- Herb of Casting Spd. -->
|
||||
<item id="8612" min="1" max="1" chance="0.33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="0.33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="0.34" /> <!-- Herb of Recovery -->
|
||||
<item id="8611" min="1" max="1" chance="10.34" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="0.66" /> <!-- Mysterious Herb -->
|
||||
</drop>
|
||||
</drop_lists>
|
||||
<status undying="false" />
|
||||
<collision>
|
||||
<radius normal="10" />
|
||||
<height normal="35" />
|
||||
</collision>
|
||||
</npc>
|
||||
</list>
|
||||
|
@ -2771,7 +2771,7 @@
|
||||
<height normal="68" />
|
||||
</collision>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<drop>
|
||||
<item id="17404" min="1" max="1" chance="1.074" /> <!-- Seraph Leather Leggings -->
|
||||
<item id="17398" min="1" max="1" chance="1.043" /> <!-- Seraph Gaiters -->
|
||||
<item id="17409" min="1" max="1" chance="0.974" /> <!-- Seraph Stockings -->
|
||||
@ -2821,7 +2821,7 @@
|
||||
<item id="35438" min="1" max="1" chance="0.3" /> <!-- Recipe: Seraph Leather Armor (60%) -->
|
||||
<item id="35439" min="1" max="1" chance="0.3" /> <!-- Recipe: Seraph Leather Leggings (60%) -->
|
||||
<item id="35430" min="1" max="1" chance="0.3" /> <!-- Recipe: Specter Retributer (60%) -->
|
||||
</death>
|
||||
</drop>
|
||||
</drop_lists>
|
||||
</npc>
|
||||
<npc id="3474" level="95" type="L2Monster" name="Super Kat the Cat">
|
||||
@ -3003,7 +3003,7 @@
|
||||
<height normal="37.5" />
|
||||
</collision>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<drop>
|
||||
<item id="17308" min="1" max="1" chance="23.3" /> <!-- Immortal Boots -->
|
||||
<item id="17318" min="1" max="1" chance="22.9" /> <!-- Immortal Gloves -->
|
||||
<item id="17304" min="1" max="1" chance="16.58" /> <!-- Immortal Helmet -->
|
||||
@ -3016,7 +3016,7 @@
|
||||
<item id="17291" min="1" max="1" chance="1.482" /> <!-- Requiem Cutter -->
|
||||
<item id="17527" min="1" max="1" chance="46.38" /> <!-- Scroll: Enchant Armor (R-grade) -->
|
||||
<item id="17526" min="1" max="1" chance="3.604" /> <!-- Scroll: Enchant Weapon (R-grade) -->
|
||||
</death>
|
||||
</drop>
|
||||
</drop_lists>
|
||||
</npc>
|
||||
<npc id="3478" level="87" type="L2Monster" name="Reinforced Kat the Cat">
|
||||
@ -3112,7 +3112,7 @@
|
||||
<height normal="37.5" />
|
||||
</collision>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<drop>
|
||||
<item id="17343" min="1" max="1" chance="66.6" /> <!-- Twilight Shield -->
|
||||
<item id="17339" min="1" max="1" chance="17.44" /> <!-- Twilight Breastplate -->
|
||||
<item id="17350" min="1" max="1" chance="16.67" /> <!-- Twilight Tunic -->
|
||||
@ -3120,7 +3120,7 @@
|
||||
<item id="17330" min="1" max="1" chance="0.75" /> <!-- Apocalypse Thrower -->
|
||||
<item id="17527" min="1" max="1" chance="46.65" /> <!-- Scroll: Enchant Armor (R-grade) -->
|
||||
<item id="17526" min="1" max="1" chance="3.631" /> <!-- Scroll: Enchant Weapon (R-grade) -->
|
||||
</death>
|
||||
</drop>
|
||||
</drop_lists>
|
||||
</npc>
|
||||
<npc id="3480" level="91" type="L2Monster" name="Mind-controlling Feline Queen">
|
||||
@ -3216,13 +3216,13 @@
|
||||
<height normal="37.5" />
|
||||
</collision>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<drop>
|
||||
<item id="17352" min="1" max="1" chance="91.435" /> <!-- Twilight Gloves -->
|
||||
<item id="17347" min="1" max="1" chance="19.86" /> <!-- Twilight Leather Gloves -->
|
||||
<item id="17330" min="1" max="1" chance="7.489" /> <!-- Apocalypse Thrower -->
|
||||
<item id="17334" min="1" max="1" chance="1.587" /> <!-- Apocalypse Retributer -->
|
||||
<item id="17526" min="1" max="1" chance="35.82" /> <!-- Scroll: Enchant Weapon (R-grade) -->
|
||||
</death>
|
||||
</drop>
|
||||
</drop_lists>
|
||||
</npc>
|
||||
<npc id="3482" level="93" type="L2Monster" name="Traitorous Mew the Cat">
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1876,7 +1876,7 @@
|
||||
</skill_list>
|
||||
<ai aggroRange="300" isAggressive="true" clanHelpRange="300" />
|
||||
<drop_lists>
|
||||
<death>
|
||||
<drop>
|
||||
<item id="17623" min="1" max="1" chance="10.047" /> <!-- Earth Wyrm Heart Ring -->
|
||||
<item id="17422" min="1" max="1" chance="9.133" /> <!-- Helios Thrower -->
|
||||
<item id="17425" min="1" max="1" chance="9.106" /> <!-- Helios Caster -->
|
||||
@ -1932,11 +1932,11 @@
|
||||
<item id="39484" min="1" max="1" chance="3.339" /> <!-- Alchemic Tome: Life Stone -->
|
||||
<item id="39483" min="1" max="1" chance="3.31" /> <!-- Alchemic Tome: Enchant Scroll -->
|
||||
<item id="39485" min="1" max="1" chance="3.266" /> <!-- Alchemic Tome: Dye -->
|
||||
</death>
|
||||
<lucky_corpse>
|
||||
</drop>
|
||||
<lucky_drop>
|
||||
<item id="39629" min="3" max="3" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
<item id="40198" min="1" max="1" chance="2.518" /> <!-- Disassembly Recipe Pouch: Armor -->
|
||||
</lucky_corpse>
|
||||
</lucky_drop>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="500" />
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,361 +1,341 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd">
|
||||
<npc id="21438" level="65" type="L2Monster" name="Heathen Warrior">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="80" />
|
||||
<param name="MoveAroundSocial1" value="80" />
|
||||
<param name="MoveAroundSocial2" value="80" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="30" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="PhysicalSpecial" id="4032" level="6" />
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="946" lhand="945" /> <!-- Skeleton Dagger / Skeleton Buckler -->
|
||||
<acquire exp="2684" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2193.43142" hpRegen="7.5" mp="1188.8" mpRegen="2.7" />
|
||||
<attack physical="582.81759" magical="397.98887" random="5" critical="8" accuracy="0" attackSpeed="253" type="DAGGER" range="40" distance="80" width="120" />
|
||||
<defence physical="271.89033" magical="198.95754" shield="136" shieldRate="20" />
|
||||
<speed>
|
||||
<walk ground="80" />
|
||||
<run ground="175" />
|
||||
</speed>
|
||||
<hit_time>520</hit_time>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4032" level="6" /> <!-- NPC Strike -->
|
||||
<skill id="4274" level="1" /> <!-- Blunt Weapon Weak Point -->
|
||||
<skill id="4408" level="8" /> <!-- HP Increase (1/4x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="13" /> <!-- Slightly Strong P. Atk. -->
|
||||
<skill id="4411" level="13" /> <!-- Slightly Strong M. Atk. -->
|
||||
<skill id="4412" level="9" /> <!-- Slightly Weak P. Def. -->
|
||||
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
|
||||
<skill id="4414" level="2" /> <!-- Standard Type -->
|
||||
<skill id="4415" level="7" /> <!-- Daggers -->
|
||||
<skill id="4416" level="1" /> <!-- Undead -->
|
||||
<skill id="4278" level="1" /> <!-- Dark Attack -->
|
||||
<skill id="4279" level="1" /> <!-- Fire Vulnerability -->
|
||||
<skill id="4275" level="2" /> <!-- Holy Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.25</s_npc_prop_hp_rate>
|
||||
<ai aggroRange="300" clanHelpRange="300" isAggressive="true">
|
||||
<clan_list>
|
||||
<clan>UNDEAD</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="70">
|
||||
<item id="57" min="10" max="24" chance="100" /> <!-- Adena -->
|
||||
</group>
|
||||
<group chance="0.003">
|
||||
<item id="729" min="1" max="1" chance="100" /> <!-- Scroll: Enchant Weapon (A-grade) -->
|
||||
</group>
|
||||
</death>
|
||||
<corpse>
|
||||
<item id="729" min="1" max="1" chance="0.003" /> <!-- Scroll: Enchant Weapon (A-grade) -->
|
||||
</corpse>
|
||||
<lucky_corpse>
|
||||
<item id="39629" min="1" max="1" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
</lucky_corpse>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="11" />
|
||||
<height normal="28.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21439" level="66" type="L2Monster" name="Heathen Inmate">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="130" />
|
||||
<param name="MoveAroundSocial1" value="130" />
|
||||
<param name="MoveAroundSocial2" value="130" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="30" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="PhysicalSpecial" id="4073" level="6" />
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="2768" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2244.67715" hpRegen="7.5" mp="1219.8" mpRegen="2.7" />
|
||||
<attack physical="603.79903" magical="412.31647" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
<defence physical="276.72752" magical="202.49719" />
|
||||
<speed>
|
||||
<walk ground="15" />
|
||||
<run ground="175" />
|
||||
</speed>
|
||||
<hit_time>450</hit_time>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4073" level="6" /> <!-- Stun -->
|
||||
<skill id="4408" level="8" /> <!-- HP Increase (1/4x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="13" /> <!-- Slightly Strong P. Atk. -->
|
||||
<skill id="4411" level="13" /> <!-- Slightly Strong M. Atk. -->
|
||||
<skill id="4412" level="9" /> <!-- Slightly Weak P. Def. -->
|
||||
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
|
||||
<skill id="4414" level="3" /> <!-- Light Armor Type -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
<skill id="4416" level="1" /> <!-- Undead -->
|
||||
<skill id="4278" level="1" /> <!-- Dark Attack -->
|
||||
<skill id="4275" level="2" /> <!-- Holy Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.25</s_npc_prop_hp_rate>
|
||||
<ai aggroRange="300" clanHelpRange="300" isAggressive="true">
|
||||
<clan_list>
|
||||
<clan>UNDEAD</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="70">
|
||||
<item id="57" min="11" max="25" chance="100" /> <!-- Adena -->
|
||||
</group>
|
||||
<group chance="0.03">
|
||||
<item id="730" min="1" max="1" chance="100" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</group>
|
||||
</death>
|
||||
<corpse>
|
||||
<item id="730" min="1" max="1" chance="0.03" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</corpse>
|
||||
<lucky_corpse>
|
||||
<item id="39629" min="1" max="1" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
</lucky_corpse>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="30" grown="15.5" />
|
||||
<height normal="40" grown="48.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21440" level="67" type="L2Monster" name="Heathen Archer">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="157" />
|
||||
<param name="MoveAroundSocial1" value="157" />
|
||||
<param name="MoveAroundSocial2" value="157" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="30" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="PhysicalSpecial" id="4040" level="6" />
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="284" /> <!-- Dark Elven Longbow -->
|
||||
<acquire exp="3029" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2295.48154" hpRegen="7.5" mp="1251.0" mpRegen="2.7" />
|
||||
<attack physical="624.93199" magical="426.74754" random="5" critical="8" accuracy="0" attackSpeed="253" reuseDelay="1500" type="BOW" range="1100" distance="10" width="0" />
|
||||
<defence physical="281.55251" magical="206.02791" />
|
||||
<speed>
|
||||
<walk ground="40" />
|
||||
<run ground="155" />
|
||||
</speed>
|
||||
<hit_time>800</hit_time>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4040" level="6" /> <!-- NPC Bow Attack -->
|
||||
<skill id="4071" level="3" /> <!-- Resist Bow/Crossbow Weapons -->
|
||||
<skill id="4274" level="1" /> <!-- Blunt Weapon Weak Point -->
|
||||
<skill id="4408" level="8" /> <!-- HP Increase (1/4x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="13" /> <!-- Slightly Strong P. Atk. -->
|
||||
<skill id="4411" level="13" /> <!-- Slightly Strong M. Atk. -->
|
||||
<skill id="4412" level="9" /> <!-- Slightly Weak P. Def. -->
|
||||
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
|
||||
<skill id="4414" level="3" /> <!-- Light Armor Type -->
|
||||
<skill id="4415" level="9" /> <!-- Bows -->
|
||||
<skill id="4416" level="1" /> <!-- Undead -->
|
||||
<skill id="4278" level="1" /> <!-- Dark Attack -->
|
||||
<skill id="4279" level="1" /> <!-- Fire Vulnerability -->
|
||||
<skill id="4275" level="2" /> <!-- Holy Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.25</s_npc_prop_hp_rate>
|
||||
<ai type="ARCHER" clanHelpRange="300" dodge="15" aggroRange="300">
|
||||
<clan_list>
|
||||
<clan>UNDEAD</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="70">
|
||||
<item id="57" min="11" max="27" chance="100" /> <!-- Adena -->
|
||||
</group>
|
||||
<group chance="0.03">
|
||||
<item id="730" min="1" max="1" chance="100" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</group>
|
||||
</death>
|
||||
<corpse>
|
||||
<item id="730" min="1" max="1" chance="0.03" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</corpse>
|
||||
<lucky_corpse>
|
||||
<item id="39629" min="1" max="1" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
</lucky_corpse>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="11" />
|
||||
<height normal="27" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21441" level="68" type="L2Monster" name="Heathen Soldier">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
<param name="MoveAroundSocial2" value="0" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="30" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="PhysicalSpecial" id="4072" level="6" />
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="96" /> <!-- Scythe -->
|
||||
<acquire exp="2937" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2345.76698" hpRegen="7.5" mp="1282.4" mpRegen="2.7" />
|
||||
<attack physical="646.17968" magical="441.25696" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
<defence physical="286.3615" magical="209.54692" />
|
||||
<speed>
|
||||
<walk ground="50" />
|
||||
<run ground="170" />
|
||||
</speed>
|
||||
<hit_time>210</hit_time>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4072" level="6" /> <!-- Stun -->
|
||||
<skill id="4274" level="1" /> <!-- Blunt Weapon Weak Point -->
|
||||
<skill id="4408" level="8" /> <!-- HP Increase (1/4x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="13" /> <!-- Slightly Strong P. Atk. -->
|
||||
<skill id="4411" level="13" /> <!-- Slightly Strong M. Atk. -->
|
||||
<skill id="4412" level="9" /> <!-- Slightly Weak P. Def. -->
|
||||
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
|
||||
<skill id="4414" level="2" /> <!-- Standard Type -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
<skill id="4416" level="1" /> <!-- Undead -->
|
||||
<skill id="4278" level="1" /> <!-- Dark Attack -->
|
||||
<skill id="4279" level="1" /> <!-- Fire Vulnerability -->
|
||||
<skill id="4275" level="2" /> <!-- Holy Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.25</s_npc_prop_hp_rate>
|
||||
<ai aggroRange="300" clanHelpRange="300" isAggressive="true">
|
||||
<clan_list>
|
||||
<clan>UNDEAD</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="70">
|
||||
<item id="57" min="11" max="26" chance="100" /> <!-- Adena -->
|
||||
</group>
|
||||
<group chance="0.003">
|
||||
<item id="729" min="1" max="1" chance="100" /> <!-- Scroll: Enchant Weapon (A-grade) -->
|
||||
</group>
|
||||
</death>
|
||||
<corpse>
|
||||
<item id="729" min="1" max="1" chance="0.003" /> <!-- Scroll: Enchant Weapon (A-grade) -->
|
||||
</corpse>
|
||||
<lucky_corpse>
|
||||
<item id="39629" min="1" max="1" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
</lucky_corpse>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="10" grown="12" />
|
||||
<height normal="28" grown="33" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21442" level="69" type="L2Monster" name="Heathen Knight">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="215" />
|
||||
<param name="MoveAroundSocial1" value="215" />
|
||||
<param name="MoveAroundSocial2" value="215" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="30" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="PhysicalSpecial" id="4232" level="6" />
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="150" lhand="103" /> <!-- Elemental Sword / Tower Shield -->
|
||||
<acquire exp="3024" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2395.45533" hpRegen="7.5" mp="1314.0" mpRegen="2.7" />
|
||||
<attack physical="667.50361" magical="455.81844" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
<defence physical="291.15063" magical="213.05139" shield="146" shieldRate="20" />
|
||||
<speed>
|
||||
<walk ground="40" />
|
||||
<run ground="165" />
|
||||
</speed>
|
||||
<hit_time>170</hit_time>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4232" level="6" /> <!-- NPC AE Strike -->
|
||||
<skill id="4274" level="1" /> <!-- Blunt Weapon Weak Point -->
|
||||
<skill id="4408" level="8" /> <!-- HP Increase (1/4x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="13" /> <!-- Slightly Strong P. Atk. -->
|
||||
<skill id="4411" level="13" /> <!-- Slightly Strong M. Atk. -->
|
||||
<skill id="4412" level="9" /> <!-- Slightly Weak P. Def. -->
|
||||
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
|
||||
<skill id="4414" level="2" /> <!-- Standard Type -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
<skill id="4416" level="1" /> <!-- Undead -->
|
||||
<skill id="4278" level="1" /> <!-- Dark Attack -->
|
||||
<skill id="4279" level="1" /> <!-- Fire Vulnerability -->
|
||||
<skill id="4275" level="2" /> <!-- Holy Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.25</s_npc_prop_hp_rate>
|
||||
<ai aggroRange="300" clanHelpRange="300" isAggressive="true">
|
||||
<clan_list>
|
||||
<clan>UNDEAD</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="70">
|
||||
<item id="57" min="12" max="27" chance="100" /> <!-- Adena -->
|
||||
</group>
|
||||
<group chance="0.03">
|
||||
<item id="730" min="1" max="1" chance="100" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</group>
|
||||
</death>
|
||||
<corpse>
|
||||
<item id="730" min="1" max="1" chance="0.03" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</corpse>
|
||||
<lucky_corpse>
|
||||
<item id="39629" min="1" max="1" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
</lucky_corpse>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="10" />
|
||||
<height normal="25" />
|
||||
</collision>
|
||||
</npc>
|
||||
</list>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd">
|
||||
<npc id="21438" level="65" type="L2Monster" name="Heathen Warrior">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="80" />
|
||||
<param name="MoveAroundSocial1" value="80" />
|
||||
<param name="MoveAroundSocial2" value="80" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="30" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="PhysicalSpecial" id="4032" level="6" />
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="946" lhand="945" /> <!-- Skeleton Dagger / Skeleton Buckler -->
|
||||
<acquire exp="2684" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2193.43142" hpRegen="7.5" mp="1188.8" mpRegen="2.7" />
|
||||
<attack physical="582.81759" magical="397.98887" random="5" critical="8" accuracy="0" attackSpeed="253" type="DAGGER" range="40" distance="80" width="120" />
|
||||
<defence physical="271.89033" magical="198.95754" shield="136" shieldRate="20" />
|
||||
<speed>
|
||||
<walk ground="80" />
|
||||
<run ground="175" />
|
||||
</speed>
|
||||
<hit_time>520</hit_time>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4032" level="6" /> <!-- NPC Strike -->
|
||||
<skill id="4274" level="1" /> <!-- Blunt Weapon Weak Point -->
|
||||
<skill id="4408" level="8" /> <!-- HP Increase (1/4x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="13" /> <!-- Slightly Strong P. Atk. -->
|
||||
<skill id="4411" level="13" /> <!-- Slightly Strong M. Atk. -->
|
||||
<skill id="4412" level="9" /> <!-- Slightly Weak P. Def. -->
|
||||
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
|
||||
<skill id="4414" level="2" /> <!-- Standard Type -->
|
||||
<skill id="4415" level="7" /> <!-- Daggers -->
|
||||
<skill id="4416" level="1" /> <!-- Undead -->
|
||||
<skill id="4278" level="1" /> <!-- Dark Attack -->
|
||||
<skill id="4279" level="1" /> <!-- Fire Vulnerability -->
|
||||
<skill id="4275" level="2" /> <!-- Holy Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.25</s_npc_prop_hp_rate>
|
||||
<ai aggroRange="300" clanHelpRange="300" isAggressive="true">
|
||||
<clan_list>
|
||||
<clan>UNDEAD</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<drop>
|
||||
<item id="57" min="10" max="24" chance="70" /> <!-- Adena -->
|
||||
<item id="729" min="1" max="1" chance="0.003" /> <!-- Scroll: Enchant Weapon (A-grade) -->
|
||||
</drop>
|
||||
<spoil>
|
||||
<item id="729" min="1" max="1" chance="0.003" /> <!-- Scroll: Enchant Weapon (A-grade) -->
|
||||
</spoil>
|
||||
<lucky_drop>
|
||||
<item id="39629" min="1" max="1" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
</lucky_drop>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="11" />
|
||||
<height normal="28.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21439" level="66" type="L2Monster" name="Heathen Inmate">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="130" />
|
||||
<param name="MoveAroundSocial1" value="130" />
|
||||
<param name="MoveAroundSocial2" value="130" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="30" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="PhysicalSpecial" id="4073" level="6" />
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="2768" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2244.67715" hpRegen="7.5" mp="1219.8" mpRegen="2.7" />
|
||||
<attack physical="603.79903" magical="412.31647" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
<defence physical="276.72752" magical="202.49719" />
|
||||
<speed>
|
||||
<walk ground="15" />
|
||||
<run ground="175" />
|
||||
</speed>
|
||||
<hit_time>450</hit_time>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4073" level="6" /> <!-- Stun -->
|
||||
<skill id="4408" level="8" /> <!-- HP Increase (1/4x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="13" /> <!-- Slightly Strong P. Atk. -->
|
||||
<skill id="4411" level="13" /> <!-- Slightly Strong M. Atk. -->
|
||||
<skill id="4412" level="9" /> <!-- Slightly Weak P. Def. -->
|
||||
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
|
||||
<skill id="4414" level="3" /> <!-- Light Armor Type -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
<skill id="4416" level="1" /> <!-- Undead -->
|
||||
<skill id="4278" level="1" /> <!-- Dark Attack -->
|
||||
<skill id="4275" level="2" /> <!-- Holy Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.25</s_npc_prop_hp_rate>
|
||||
<ai aggroRange="300" clanHelpRange="300" isAggressive="true">
|
||||
<clan_list>
|
||||
<clan>UNDEAD</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<drop>
|
||||
<item id="57" min="11" max="25" chance="70" /> <!-- Adena -->
|
||||
<item id="730" min="1" max="1" chance="0.03" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</drop>
|
||||
<spoil>
|
||||
<item id="730" min="1" max="1" chance="0.03" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</spoil>
|
||||
<lucky_drop>
|
||||
<item id="39629" min="1" max="1" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
</lucky_drop>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="30" grown="15.5" />
|
||||
<height normal="40" grown="48.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21440" level="67" type="L2Monster" name="Heathen Archer">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="157" />
|
||||
<param name="MoveAroundSocial1" value="157" />
|
||||
<param name="MoveAroundSocial2" value="157" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="30" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="PhysicalSpecial" id="4040" level="6" />
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="284" /> <!-- Dark Elven Longbow -->
|
||||
<acquire exp="3029" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2295.48154" hpRegen="7.5" mp="1251.0" mpRegen="2.7" />
|
||||
<attack physical="624.93199" magical="426.74754" random="5" critical="8" accuracy="0" attackSpeed="253" reuseDelay="1500" type="BOW" range="1100" distance="10" width="0" />
|
||||
<defence physical="281.55251" magical="206.02791" />
|
||||
<speed>
|
||||
<walk ground="40" />
|
||||
<run ground="155" />
|
||||
</speed>
|
||||
<hit_time>800</hit_time>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4040" level="6" /> <!-- NPC Bow Attack -->
|
||||
<skill id="4071" level="3" /> <!-- Resist Bow/Crossbow Weapons -->
|
||||
<skill id="4274" level="1" /> <!-- Blunt Weapon Weak Point -->
|
||||
<skill id="4408" level="8" /> <!-- HP Increase (1/4x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="13" /> <!-- Slightly Strong P. Atk. -->
|
||||
<skill id="4411" level="13" /> <!-- Slightly Strong M. Atk. -->
|
||||
<skill id="4412" level="9" /> <!-- Slightly Weak P. Def. -->
|
||||
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
|
||||
<skill id="4414" level="3" /> <!-- Light Armor Type -->
|
||||
<skill id="4415" level="9" /> <!-- Bows -->
|
||||
<skill id="4416" level="1" /> <!-- Undead -->
|
||||
<skill id="4278" level="1" /> <!-- Dark Attack -->
|
||||
<skill id="4279" level="1" /> <!-- Fire Vulnerability -->
|
||||
<skill id="4275" level="2" /> <!-- Holy Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.25</s_npc_prop_hp_rate>
|
||||
<ai type="ARCHER" clanHelpRange="300" dodge="15" aggroRange="300">
|
||||
<clan_list>
|
||||
<clan>UNDEAD</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<drop>
|
||||
<item id="57" min="11" max="27" chance="70" /> <!-- Adena -->
|
||||
<item id="730" min="1" max="1" chance="0.03" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</drop>
|
||||
<spoil>
|
||||
<item id="730" min="1" max="1" chance="0.03" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</spoil>
|
||||
<lucky_drop>
|
||||
<item id="39629" min="1" max="1" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
</lucky_drop>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="11" />
|
||||
<height normal="27" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21441" level="68" type="L2Monster" name="Heathen Soldier">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
<param name="MoveAroundSocial2" value="0" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="30" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="PhysicalSpecial" id="4072" level="6" />
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="96" /> <!-- Scythe -->
|
||||
<acquire exp="2937" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2345.76698" hpRegen="7.5" mp="1282.4" mpRegen="2.7" />
|
||||
<attack physical="646.17968" magical="441.25696" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
<defence physical="286.3615" magical="209.54692" />
|
||||
<speed>
|
||||
<walk ground="50" />
|
||||
<run ground="170" />
|
||||
</speed>
|
||||
<hit_time>210</hit_time>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4072" level="6" /> <!-- Stun -->
|
||||
<skill id="4274" level="1" /> <!-- Blunt Weapon Weak Point -->
|
||||
<skill id="4408" level="8" /> <!-- HP Increase (1/4x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="13" /> <!-- Slightly Strong P. Atk. -->
|
||||
<skill id="4411" level="13" /> <!-- Slightly Strong M. Atk. -->
|
||||
<skill id="4412" level="9" /> <!-- Slightly Weak P. Def. -->
|
||||
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
|
||||
<skill id="4414" level="2" /> <!-- Standard Type -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
<skill id="4416" level="1" /> <!-- Undead -->
|
||||
<skill id="4278" level="1" /> <!-- Dark Attack -->
|
||||
<skill id="4279" level="1" /> <!-- Fire Vulnerability -->
|
||||
<skill id="4275" level="2" /> <!-- Holy Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.25</s_npc_prop_hp_rate>
|
||||
<ai aggroRange="300" clanHelpRange="300" isAggressive="true">
|
||||
<clan_list>
|
||||
<clan>UNDEAD</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<drop>
|
||||
<item id="57" min="11" max="26" chance="70" /> <!-- Adena -->
|
||||
<item id="729" min="1" max="1" chance="0.003" /> <!-- Scroll: Enchant Weapon (A-grade) -->
|
||||
</drop>
|
||||
<spoil>
|
||||
<item id="729" min="1" max="1" chance="0.003" /> <!-- Scroll: Enchant Weapon (A-grade) -->
|
||||
</spoil>
|
||||
<lucky_drop>
|
||||
<item id="39629" min="1" max="1" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
</lucky_drop>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="10" grown="12" />
|
||||
<height normal="28" grown="33" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21442" level="69" type="L2Monster" name="Heathen Knight">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="215" />
|
||||
<param name="MoveAroundSocial1" value="215" />
|
||||
<param name="MoveAroundSocial2" value="215" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="30" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="PhysicalSpecial" id="4232" level="6" />
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="150" lhand="103" /> <!-- Elemental Sword / Tower Shield -->
|
||||
<acquire exp="3024" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2395.45533" hpRegen="7.5" mp="1314.0" mpRegen="2.7" />
|
||||
<attack physical="667.50361" magical="455.81844" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
<defence physical="291.15063" magical="213.05139" shield="146" shieldRate="20" />
|
||||
<speed>
|
||||
<walk ground="40" />
|
||||
<run ground="165" />
|
||||
</speed>
|
||||
<hit_time>170</hit_time>
|
||||
<abnormalResist physical="10" magical="10" />
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4232" level="6" /> <!-- NPC AE Strike -->
|
||||
<skill id="4274" level="1" /> <!-- Blunt Weapon Weak Point -->
|
||||
<skill id="4408" level="8" /> <!-- HP Increase (1/4x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="13" /> <!-- Slightly Strong P. Atk. -->
|
||||
<skill id="4411" level="13" /> <!-- Slightly Strong M. Atk. -->
|
||||
<skill id="4412" level="9" /> <!-- Slightly Weak P. Def. -->
|
||||
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
|
||||
<skill id="4414" level="2" /> <!-- Standard Type -->
|
||||
<skill id="4415" level="3" /> <!-- One-handed Sword -->
|
||||
<skill id="4416" level="1" /> <!-- Undead -->
|
||||
<skill id="4278" level="1" /> <!-- Dark Attack -->
|
||||
<skill id="4279" level="1" /> <!-- Fire Vulnerability -->
|
||||
<skill id="4275" level="2" /> <!-- Holy Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.25</s_npc_prop_hp_rate>
|
||||
<ai aggroRange="300" clanHelpRange="300" isAggressive="true">
|
||||
<clan_list>
|
||||
<clan>UNDEAD</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<drop>
|
||||
<item id="57" min="12" max="27" chance="70" /> <!-- Adena -->
|
||||
<item id="730" min="1" max="1" chance="0.03" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</drop>
|
||||
<spoil>
|
||||
<item id="730" min="1" max="1" chance="0.03" /> <!-- Scroll: Enchant Armor (A-grade) -->
|
||||
</spoil>
|
||||
<lucky_drop>
|
||||
<item id="39629" min="1" max="1" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
</lucky_drop>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="10" />
|
||||
<height normal="25" />
|
||||
</collision>
|
||||
</npc>
|
||||
</list>
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,91 +1,85 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd">
|
||||
<npc id="21797" level="55" type="L2Monster" name="Timiniel's Spirit">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
<param name="MoveAroundSocial2" value="0" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="10" />
|
||||
<param name="SpiritShot" value="100" />
|
||||
<param name="SpiritShotRate" value="5" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="DDMagic" id="4562" level="5" /> <!-- NPC Solar Flare -->
|
||||
</parameters>
|
||||
<race>FAIRY</race>
|
||||
<sex>FEMALE</sex>
|
||||
<acquire exp="3562" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="1673.05473" hpRegen="6.5" mp="889.8" mpRegen="2.4" />
|
||||
<attack physical="388.11142" magical="265.02979" random="50" critical="1" accuracy="9" attackSpeed="253" type="BLUNT" range="40" distance="80" width="120" />
|
||||
<defence physical="223.6362" magical="148.899508363765" />
|
||||
<attribute>
|
||||
<defence fire="20" water="20" wind="189" earth="-5" holy="20" dark="20" />
|
||||
</attribute>
|
||||
<speed>
|
||||
<walk ground="80" />
|
||||
<run ground="165" />
|
||||
</speed>
|
||||
<hit_time>720</hit_time>
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4408" level="9" /> <!-- HP Increase (1/2x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="9" /> <!-- Slightly Weak P. Atk. -->
|
||||
<skill id="4411" level="9" /> <!-- Slightly Weak M. Atk. -->
|
||||
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
|
||||
<skill id="4413" level="13" /> <!-- Slightly Strong M. Def. -->
|
||||
<skill id="4414" level="3" /> <!-- Light Armor Type -->
|
||||
<skill id="4415" level="5" /> <!-- Blunt Weapons -->
|
||||
<skill id="4416" level="13" /> <!-- Fairies -->
|
||||
<skill id="4562" level="5" /> <!-- NPC Solar Flare -->
|
||||
<skill id="4011" level="5" /> <!-- Wind Resistance -->
|
||||
<skill id="4282" level="1" /> <!-- Earth Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.5</s_npc_prop_hp_rate>
|
||||
<ai aggroRange="300" clanHelpRange="300" isAggressive="false">
|
||||
<clan_list>
|
||||
<clan>TIMINIEL</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="70">
|
||||
<item id="57" min="315" max="643" chance="100" /> <!-- Adena -->
|
||||
</group>
|
||||
<group chance="0.6668000221252441">
|
||||
<item id="2497" min="1" max="1" chance="0.7653" /> <!-- Full Plate Shield -->
|
||||
<item id="2966" min="1" max="1" chance="60.4723" /> <!-- Full Plate Shield Fragment -->
|
||||
<item id="2414" min="1" max="1" chance="0.5357" /> <!-- Full Plate Helmet -->
|
||||
<item id="2959" min="1" max="1" chance="38.2267" /> <!-- Full Plate Helmet Design -->
|
||||
</group>
|
||||
<group chance="15.31820011138916">
|
||||
<item id="1869" min="1" max="1" chance="17.4926" /> <!-- Iron Ore -->
|
||||
<item id="1870" min="1" max="1" chance="17.4926" /> <!-- Coal -->
|
||||
<item id="1871" min="1" max="1" chance="17.4926" /> <!-- Charcoal -->
|
||||
<item id="1872" min="1" max="1" chance="23.3234" /> <!-- Animal Bone -->
|
||||
<item id="1867" min="1" max="1" chance="23.3234" /> <!-- Animal Skin -->
|
||||
<item id="4175" min="1" max="1" chance="0.337" /> <!-- Recipe: Sealed Avadon Boots (100%) -->
|
||||
<item id="4972" min="1" max="1" chance="0.0202" /> <!-- Recipe: Great Axe (60%) -->
|
||||
<item id="8726" min="1" max="1" chance="0.4049" /> <!-- Life Stone - Level 55 -->
|
||||
<item id="8736" min="1" max="1" chance="0.1012" /> <!-- Mid-Grade Life Stone - Level 55 -->
|
||||
<item id="8746" min="1" max="1" chance="0.0101" /> <!-- High-Grade Life Stone - Level 55 -->
|
||||
<item id="8756" min="1" max="1" chance="0.002" /> <!-- Top-Grade Life Stone - Level 55 -->
|
||||
</group>
|
||||
</death>
|
||||
<corpse>
|
||||
<item id="2961" min="1" max="1" chance="4.3468" /> <!-- Full Plate Boots Part -->
|
||||
<item id="1867" min="1" max="3" chance="53.219" /> <!-- Animal Skin -->
|
||||
<item id="1869" min="1" max="1" chance="79.8286" /> <!-- Iron Ore -->
|
||||
</corpse>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="5" />
|
||||
<height normal="25" />
|
||||
</collision>
|
||||
</npc>
|
||||
</list>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd">
|
||||
<npc id="21797" level="55" type="L2Monster" name="Timiniel's Spirit">
|
||||
<!-- Confirmed CT2.5 -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
<param name="MoveAroundSocial2" value="0" />
|
||||
<param name="SoulShot" value="100" />
|
||||
<param name="SoulShotRate" value="10" />
|
||||
<param name="SpiritShot" value="100" />
|
||||
<param name="SpiritShotRate" value="5" />
|
||||
<param name="LongRangeGuardRate" value="5" />
|
||||
<skill name="DDMagic" id="4562" level="5" /> <!-- NPC Solar Flare -->
|
||||
</parameters>
|
||||
<race>FAIRY</race>
|
||||
<sex>FEMALE</sex>
|
||||
<acquire exp="3562" sp="1" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="1673.05473" hpRegen="6.5" mp="889.8" mpRegen="2.4" />
|
||||
<attack physical="388.11142" magical="265.02979" random="50" critical="1" accuracy="9" attackSpeed="253" type="BLUNT" range="40" distance="80" width="120" />
|
||||
<defence physical="223.6362" magical="148.899508363765" />
|
||||
<attribute>
|
||||
<defence fire="20" water="20" wind="189" earth="-5" holy="20" dark="20" />
|
||||
</attribute>
|
||||
<speed>
|
||||
<walk ground="80" />
|
||||
<run ground="165" />
|
||||
</speed>
|
||||
<hit_time>720</hit_time>
|
||||
</stats>
|
||||
<status undying="false" canBeSown="true" />
|
||||
<skill_list>
|
||||
<skill id="4408" level="9" /> <!-- HP Increase (1/2x) -->
|
||||
<skill id="4409" level="1" /> <!-- MP Increase (1x) -->
|
||||
<skill id="4410" level="9" /> <!-- Slightly Weak P. Atk. -->
|
||||
<skill id="4411" level="9" /> <!-- Slightly Weak M. Atk. -->
|
||||
<skill id="4412" level="13" /> <!-- Slightly Strong P. Def. -->
|
||||
<skill id="4413" level="13" /> <!-- Slightly Strong M. Def. -->
|
||||
<skill id="4414" level="3" /> <!-- Light Armor Type -->
|
||||
<skill id="4415" level="5" /> <!-- Blunt Weapons -->
|
||||
<skill id="4416" level="13" /> <!-- Fairies -->
|
||||
<skill id="4562" level="5" /> <!-- NPC Solar Flare -->
|
||||
<skill id="4011" level="5" /> <!-- Wind Resistance -->
|
||||
<skill id="4282" level="1" /> <!-- Earth Attack Vulnerability -->
|
||||
</skill_list>
|
||||
<shots shotChance="30" spiritChance="30" />
|
||||
<ex_crt_effect>false</ex_crt_effect>
|
||||
<s_npc_prop_hp_rate>0.5</s_npc_prop_hp_rate>
|
||||
<ai aggroRange="300" clanHelpRange="300" isAggressive="false">
|
||||
<clan_list>
|
||||
<clan>TIMINIEL</clan>
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<drop>
|
||||
<item id="57" min="315" max="643" chance="70" /> <!-- Adena -->
|
||||
<item id="2497" min="1" max="1" chance="0.00510302056932449" /> <!-- Full Plate Shield -->
|
||||
<item id="2966" min="1" max="1" chance="0.403229309779644" /> <!-- Full Plate Shield Fragment -->
|
||||
<item id="2414" min="1" max="1" chance="0.00357204771852493" /> <!-- Full Plate Helmet -->
|
||||
<item id="2959" min="1" max="1" chance="0.254895644057751" /> <!-- Full Plate Helmet Design -->
|
||||
<item id="1869" min="1" max="1" chance="2.67955147268486" /> <!-- Iron Ore -->
|
||||
<item id="1870" min="1" max="1" chance="2.67955147268486" /> <!-- Coal -->
|
||||
<item id="1871" min="1" max="1" chance="2.67955147268486" /> <!-- Charcoal -->
|
||||
<item id="1872" min="1" max="1" chance="3.57272508477974" /> <!-- Animal Bone -->
|
||||
<item id="1867" min="1" max="1" chance="3.57272508477974" /> <!-- Animal Skin -->
|
||||
<item id="4175" min="1" max="1" chance="0.0516223343753815" /> <!-- Recipe: Sealed Avadon Boots (100%) -->
|
||||
<item id="4972" min="1" max="1" chance="0.00309427642250061" /> <!-- Recipe: Great Axe (60%) -->
|
||||
<item id="8726" min="1" max="1" chance="0.0620233922510147" /> <!-- Life Stone - Level 55 -->
|
||||
<item id="8736" min="1" max="1" chance="0.0155020185127258" /> <!-- Mid-Grade Life Stone - Level 55 -->
|
||||
<item id="8746" min="1" max="1" chance="0.00154713821125031" /> <!-- High-Grade Life Stone - Level 55 -->
|
||||
<item id="8756" min="1" max="1" chance="0.000306364002227783" /> <!-- Top-Grade Life Stone - Level 55 -->
|
||||
</drop>
|
||||
<spoil>
|
||||
<item id="2961" min="1" max="1" chance="4.3468" /> <!-- Full Plate Boots Part -->
|
||||
<item id="1867" min="1" max="3" chance="53.219" /> <!-- Animal Skin -->
|
||||
<item id="1869" min="1" max="1" chance="79.8286" /> <!-- Iron Ore -->
|
||||
</spoil>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="5" />
|
||||
<height normal="25" />
|
||||
</collision>
|
||||
</npc>
|
||||
</list>
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -9,14 +9,6 @@
|
||||
<xs:complexType name="drop_list">
|
||||
<xs:choice minOccurs="1" maxOccurs="unbounded">
|
||||
<xs:element name="item" type="drop_list_item" />
|
||||
<xs:element name="group">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="item" type="drop_list_item" minOccurs="1" maxOccurs="unbounded" />
|
||||
</xs:sequence>
|
||||
<xs:attribute name="chance" type="xs:decimal" />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
<xs:element name="list">
|
||||
@ -267,9 +259,9 @@
|
||||
<xs:element name="drop_lists" minOccurs="0" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="death" type="drop_list" minOccurs="0" maxOccurs="1" />
|
||||
<xs:element name="corpse" type="drop_list" minOccurs="0" maxOccurs="1" />
|
||||
<xs:element name="lucky_corpse" type="drop_list" minOccurs="0" maxOccurs="1" />
|
||||
<xs:element name="drop" type="drop_list" minOccurs="0" maxOccurs="1" />
|
||||
<xs:element name="spoil" type="drop_list" minOccurs="0" maxOccurs="1" />
|
||||
<xs:element name="lucky_drop" type="drop_list" minOccurs="0" maxOccurs="1" />
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
@ -118,7 +118,6 @@ public final class Config
|
||||
public static final String CUSTOM_FIND_PVP_CONFIG_FILE = "./config/Custom/FindPvP.ini";
|
||||
public static final String CUSTOM_MULTILANGUAL_SUPPORT_CONFIG_FILE = "./config/Custom/MultilingualSupport.ini";
|
||||
public static final String CUSTOM_OFFLINE_TRADE_CONFIG_FILE = "./config/Custom/OfflineTrade.ini";
|
||||
public static final String CUSTOM_OLD_DROP_BEHAVIOR_CONFIG_FILE = "./config/Custom/OldDropBehavior.ini";
|
||||
public static final String CUSTOM_PASSWORD_CHANGE_CONFIG_FILE = "./config/Custom/PasswordChange.ini";
|
||||
public static final String CUSTOM_PC_CAFE_CONFIG_FILE = "./config/Custom/PcCafe.ini";
|
||||
public static final String CUSTOM_PREMIUM_SYSTEM_CONFIG_FILE = "./config/Custom/PremiumSystem.ini";
|
||||
@ -451,7 +450,6 @@ public final class Config
|
||||
public static boolean CLEAR_DROPPED_ITEM_TABLE;
|
||||
public static boolean ORDER_QUEST_LIST_BY_QUESTID;
|
||||
public static boolean AUTODELETE_INVALID_QUEST_DATA;
|
||||
public static boolean PRECISE_DROP_CALCULATION;
|
||||
public static boolean MULTIPLE_ITEM_DROP;
|
||||
public static boolean FORCE_INVENTORY_UPDATE;
|
||||
public static boolean LAZY_CACHE;
|
||||
@ -695,11 +693,11 @@ public final class Config
|
||||
public static float RATE_QUEST_REWARD_RECIPE;
|
||||
public static float RATE_QUEST_REWARD_MATERIAL;
|
||||
public static float RATE_DEATH_DROP_AMOUNT_MULTIPLIER;
|
||||
public static float RATE_CORPSE_DROP_AMOUNT_MULTIPLIER;
|
||||
public static float RATE_SPOIL_DROP_AMOUNT_MULTIPLIER;
|
||||
public static float RATE_HERB_DROP_AMOUNT_MULTIPLIER;
|
||||
public static float RATE_RAID_DROP_AMOUNT_MULTIPLIER;
|
||||
public static float RATE_DEATH_DROP_CHANCE_MULTIPLIER;
|
||||
public static float RATE_CORPSE_DROP_CHANCE_MULTIPLIER;
|
||||
public static float RATE_SPOIL_DROP_CHANCE_MULTIPLIER;
|
||||
public static float RATE_HERB_DROP_CHANCE_MULTIPLIER;
|
||||
public static float RATE_RAID_DROP_CHANCE_MULTIPLIER;
|
||||
public static Map<Integer, Float> RATE_DROP_AMOUNT_BY_ID;
|
||||
@ -1053,7 +1051,6 @@ public final class Config
|
||||
public static int DUALBOX_CHECK_MAX_L2EVENT_PARTICIPANTS_PER_IP;
|
||||
public static Map<Integer, Integer> DUALBOX_CHECK_WHITELIST;
|
||||
public static boolean ALLOW_CHANGE_PASSWORD;
|
||||
public static boolean OLD_DROP_BEHAVIOR;
|
||||
public static boolean ALLOW_HUMAN;
|
||||
public static boolean ALLOW_ELF;
|
||||
public static boolean ALLOW_DARKELF;
|
||||
@ -1954,14 +1951,6 @@ public final class Config
|
||||
PET_HP_REGEN_MULTIPLIER = NPC.getDouble("PetHpRegenMultiplier", 100) / 100;
|
||||
PET_MP_REGEN_MULTIPLIER = NPC.getDouble("PetMpRegenMultiplier", 100) / 100;
|
||||
|
||||
DROP_ADENA_MIN_LEVEL_DIFFERENCE = NPC.getInt("DropAdenaMinLevelDifference", 8);
|
||||
DROP_ADENA_MAX_LEVEL_DIFFERENCE = NPC.getInt("DropAdenaMaxLevelDifference", 15);
|
||||
DROP_ADENA_MIN_LEVEL_GAP_CHANCE = NPC.getDouble("DropAdenaMinLevelGapChance", 10);
|
||||
|
||||
DROP_ITEM_MIN_LEVEL_DIFFERENCE = NPC.getInt("DropItemMinLevelDifference", 5);
|
||||
DROP_ITEM_MAX_LEVEL_DIFFERENCE = NPC.getInt("DropItemMaxLevelDifference", 10);
|
||||
DROP_ITEM_MIN_LEVEL_GAP_CHANCE = NPC.getDouble("DropItemMinLevelGapChance", 10);
|
||||
|
||||
VITALITY_CONSUME_BY_MOB = NPC.getInt("VitalityConsumeByMob", 2250);
|
||||
VITALITY_CONSUME_BY_BOSS = NPC.getInt("VitalityConsumeByBoss", 1125);
|
||||
|
||||
@ -2034,11 +2023,11 @@ public final class Config
|
||||
KARMA_RATE_DROP_EQUIP_WEAPON = RatesSettings.getInt("KarmaRateDropEquipWeapon", 10);
|
||||
|
||||
RATE_DEATH_DROP_AMOUNT_MULTIPLIER = RatesSettings.getFloat("DeathDropAmountMultiplier", 1);
|
||||
RATE_CORPSE_DROP_AMOUNT_MULTIPLIER = RatesSettings.getFloat("CorpseDropAmountMultiplier", 1);
|
||||
RATE_SPOIL_DROP_AMOUNT_MULTIPLIER = RatesSettings.getFloat("SpoilDropAmountMultiplier", 1);
|
||||
RATE_HERB_DROP_AMOUNT_MULTIPLIER = RatesSettings.getFloat("HerbDropAmountMultiplier", 1);
|
||||
RATE_RAID_DROP_AMOUNT_MULTIPLIER = RatesSettings.getFloat("RaidDropAmountMultiplier", 1);
|
||||
RATE_DEATH_DROP_CHANCE_MULTIPLIER = RatesSettings.getFloat("DeathDropChanceMultiplier", 1);
|
||||
RATE_CORPSE_DROP_CHANCE_MULTIPLIER = RatesSettings.getFloat("CorpseDropChanceMultiplier", 1);
|
||||
RATE_SPOIL_DROP_CHANCE_MULTIPLIER = RatesSettings.getFloat("SpoilDropChanceMultiplier", 1);
|
||||
RATE_HERB_DROP_CHANCE_MULTIPLIER = RatesSettings.getFloat("HerbDropChanceMultiplier", 1);
|
||||
RATE_RAID_DROP_CHANCE_MULTIPLIER = RatesSettings.getFloat("RaidDropChanceMultiplier", 1);
|
||||
|
||||
@ -2098,6 +2087,13 @@ public final class Config
|
||||
}
|
||||
}
|
||||
|
||||
DROP_ADENA_MIN_LEVEL_DIFFERENCE = RatesSettings.getInt("DropAdenaMinLevelDifference", 8);
|
||||
DROP_ADENA_MAX_LEVEL_DIFFERENCE = RatesSettings.getInt("DropAdenaMaxLevelDifference", 15);
|
||||
DROP_ADENA_MIN_LEVEL_GAP_CHANCE = RatesSettings.getDouble("DropAdenaMinLevelGapChance", 10);
|
||||
DROP_ITEM_MIN_LEVEL_DIFFERENCE = RatesSettings.getInt("DropItemMinLevelDifference", 5);
|
||||
DROP_ITEM_MAX_LEVEL_DIFFERENCE = RatesSettings.getInt("DropItemMaxLevelDifference", 10);
|
||||
DROP_ITEM_MIN_LEVEL_GAP_CHANCE = RatesSettings.getDouble("DropItemMinLevelGapChance", 10);
|
||||
|
||||
// Load PvP config file (if exists)
|
||||
final PropertiesParser PVPSettings = new PropertiesParser(PVP_CONFIG_FILE);
|
||||
|
||||
@ -2497,11 +2493,6 @@ public final class Config
|
||||
OFFLINE_DISCONNECT_FINISHED = OfflineTrade.getBoolean("OfflineDisconnectFinished", true);
|
||||
STORE_OFFLINE_TRADE_IN_REALTIME = OfflineTrade.getBoolean("StoreOfflineTradeInRealtime", true);
|
||||
|
||||
// Load OldDropBehavior config file (if exists)
|
||||
final PropertiesParser OldDropBehavior = new PropertiesParser(CUSTOM_OLD_DROP_BEHAVIOR_CONFIG_FILE);
|
||||
|
||||
OLD_DROP_BEHAVIOR = OldDropBehavior.getBoolean("OldDropBehavior", false);
|
||||
|
||||
// Load PasswordChange config file (if exists)
|
||||
final PropertiesParser PasswordChange = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
|
||||
|
||||
|
@ -39,16 +39,14 @@ import com.l2jmobius.commons.util.CommonUtil;
|
||||
import com.l2jmobius.commons.util.IGameXmlReader;
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.enums.AISkillScope;
|
||||
import com.l2jmobius.gameserver.enums.DropType;
|
||||
import com.l2jmobius.gameserver.enums.MpRewardAffectType;
|
||||
import com.l2jmobius.gameserver.enums.MpRewardType;
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.actor.templates.L2NpcTemplate;
|
||||
import com.l2jmobius.gameserver.model.base.ClassId;
|
||||
import com.l2jmobius.gameserver.model.drops.DropListScope;
|
||||
import com.l2jmobius.gameserver.model.drops.GeneralDropItem;
|
||||
import com.l2jmobius.gameserver.model.drops.GroupedGeneralDropItem;
|
||||
import com.l2jmobius.gameserver.model.drops.IDropItem;
|
||||
import com.l2jmobius.gameserver.model.effects.L2EffectType;
|
||||
import com.l2jmobius.gameserver.model.holders.DropHolder;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
|
||||
/**
|
||||
@ -104,7 +102,7 @@ public class NpcData implements IGameXmlReader
|
||||
Map<Integer, Skill> skills = null;
|
||||
Set<Integer> clans = null;
|
||||
Set<Integer> ignoreClanNpcIds = null;
|
||||
Map<DropListScope, List<IDropItem>> dropLists = null;
|
||||
List<DropHolder> dropLists = null;
|
||||
set.set("id", npcId);
|
||||
set.set("displayId", parseInteger(attrs, "displayId"));
|
||||
set.set("level", parseByte(attrs, "level"));
|
||||
@ -426,26 +424,39 @@ public class NpcData implements IGameXmlReader
|
||||
{
|
||||
for (Node drop_lists_node = npc_node.getFirstChild(); drop_lists_node != null; drop_lists_node = drop_lists_node.getNextSibling())
|
||||
{
|
||||
DropListScope dropListScope = null;
|
||||
DropType dropType = null;
|
||||
|
||||
try
|
||||
{
|
||||
dropListScope = Enum.valueOf(DropListScope.class, drop_lists_node.getNodeName().toUpperCase());
|
||||
dropType = Enum.valueOf(DropType.class, drop_lists_node.getNodeName().toUpperCase());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
}
|
||||
|
||||
if (dropListScope != null)
|
||||
if (dropType != null)
|
||||
{
|
||||
if (dropLists == null)
|
||||
{
|
||||
dropLists = new EnumMap<>(DropListScope.class);
|
||||
dropLists = new ArrayList<>();
|
||||
}
|
||||
|
||||
final List<IDropItem> dropList = new ArrayList<>();
|
||||
parseDropList(f, drop_lists_node, dropListScope, dropList);
|
||||
dropLists.put(dropListScope, Collections.unmodifiableList(dropList));
|
||||
for (Node drop_node = drop_lists_node.getFirstChild(); drop_node != null; drop_node = drop_node.getNextSibling())
|
||||
{
|
||||
final NamedNodeMap drop_attrs = drop_node.getAttributes();
|
||||
if ("item".equals(drop_node.getNodeName().toLowerCase()))
|
||||
{
|
||||
final DropHolder dropItem = new DropHolder(dropType, parseInteger(drop_attrs, "id"), parseLong(drop_attrs, "min"), parseLong(drop_attrs, "max"), parseDouble(drop_attrs, "chance"));
|
||||
if (ItemTable.getInstance().getTemplate(parseInteger(drop_attrs, "id")) == null)
|
||||
{
|
||||
LOGGER.warning("DropListItem: Could not find item with id " + parseInteger(drop_attrs, "id") + ".");
|
||||
}
|
||||
else
|
||||
{
|
||||
dropLists.add(dropItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -611,7 +622,26 @@ public class NpcData implements IGameXmlReader
|
||||
template.setClans(clans);
|
||||
template.setIgnoreClanNpcIds(ignoreClanNpcIds);
|
||||
|
||||
template.setDropLists(dropLists);
|
||||
if (dropLists != null)
|
||||
{
|
||||
for (DropHolder dropHolder : dropLists)
|
||||
{
|
||||
switch (dropHolder.getDropType())
|
||||
{
|
||||
case DROP:
|
||||
case LUCKY_DROP: // TODO: Luck is added to death drops.
|
||||
{
|
||||
template.addDrop(dropHolder);
|
||||
break;
|
||||
}
|
||||
case SPOIL:
|
||||
{
|
||||
template.addSpoil(dropHolder);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!template.getParameters().getMinionList("Privates").isEmpty())
|
||||
{
|
||||
@ -626,69 +656,6 @@ public class NpcData implements IGameXmlReader
|
||||
}
|
||||
}
|
||||
|
||||
private void parseDropList(File f, Node drop_list_node, DropListScope dropListScope, List<IDropItem> drops)
|
||||
{
|
||||
for (Node drop_node = drop_list_node.getFirstChild(); drop_node != null; drop_node = drop_node.getNextSibling())
|
||||
{
|
||||
final NamedNodeMap attrs = drop_node.getAttributes();
|
||||
switch (drop_node.getNodeName().toLowerCase())
|
||||
{
|
||||
case "group":
|
||||
{
|
||||
final GroupedGeneralDropItem dropItem = dropListScope.newGroupedDropItem(parseDouble(attrs, "chance"));
|
||||
final List<IDropItem> groupedDropList = new ArrayList<>(2);
|
||||
for (Node group_node = drop_node.getFirstChild(); group_node != null; group_node = group_node.getNextSibling())
|
||||
{
|
||||
parseDropListItem(group_node, dropListScope, groupedDropList);
|
||||
}
|
||||
|
||||
final List<GeneralDropItem> items = new ArrayList<>(groupedDropList.size());
|
||||
for (IDropItem item : groupedDropList)
|
||||
{
|
||||
if (item instanceof GeneralDropItem)
|
||||
{
|
||||
items.add((GeneralDropItem) item);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGGER.warning("[" + f + "] grouped general drop item supports only general drop item.");
|
||||
}
|
||||
}
|
||||
dropItem.setItems(items);
|
||||
|
||||
drops.add(dropItem);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
parseDropListItem(drop_node, dropListScope, drops);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void parseDropListItem(Node drop_list_item, DropListScope dropListScope, List<IDropItem> drops)
|
||||
{
|
||||
final NamedNodeMap attrs = drop_list_item.getAttributes();
|
||||
switch (drop_list_item.getNodeName().toLowerCase())
|
||||
{
|
||||
case "item":
|
||||
{
|
||||
final IDropItem dropItem = dropListScope.newDropItem(parseInteger(attrs, "id"), parseLong(attrs, "min"), parseLong(attrs, "max"), parseDouble(attrs, "chance"));
|
||||
if (ItemTable.getInstance().getTemplate(parseInteger(attrs, "id")) == null)
|
||||
{
|
||||
LOGGER.warning("DropListItem: Could not find item with id " + parseInteger(attrs, "id") + ".");
|
||||
}
|
||||
else if (dropItem != null)
|
||||
{
|
||||
drops.add(dropItem);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or creates a clan id if it doesnt exists.
|
||||
* @param clanName the clan name to get or create its id
|
||||
|
@ -1,36 +1,27 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jmobius.gameserver.model.drops;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
|
||||
/**
|
||||
* @author NosBit
|
||||
*/
|
||||
public interface IDropItem
|
||||
{
|
||||
/**
|
||||
* Calculates drops of this drop item.
|
||||
* @param victim the victim
|
||||
* @param killer the killer
|
||||
* @return {@code null} or empty collection if there are no drops, a collection containing all items to drop otherwise
|
||||
*/
|
||||
Collection<ItemHolder> calculateDrops(L2Character victim, L2Character killer);
|
||||
}
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jmobius.gameserver.enums;
|
||||
|
||||
/**
|
||||
* @author Mobius
|
||||
*/
|
||||
public enum DropType
|
||||
{
|
||||
DROP,
|
||||
SPOIL,
|
||||
LUCKY_DROP;
|
||||
}
|
@ -45,6 +45,7 @@ import com.l2jmobius.gameserver.datatables.EventDroplist;
|
||||
import com.l2jmobius.gameserver.datatables.EventDroplist.DateDrop;
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.enums.ChatType;
|
||||
import com.l2jmobius.gameserver.enums.DropType;
|
||||
import com.l2jmobius.gameserver.enums.InstanceType;
|
||||
import com.l2jmobius.gameserver.enums.Team;
|
||||
import com.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
|
||||
@ -65,7 +66,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2ServitorInstance;
|
||||
import com.l2jmobius.gameserver.model.actor.status.AttackableStatus;
|
||||
import com.l2jmobius.gameserver.model.actor.tasks.attackable.CommandChannelTimer;
|
||||
import com.l2jmobius.gameserver.model.actor.templates.L2NpcTemplate;
|
||||
import com.l2jmobius.gameserver.model.drops.DropListScope;
|
||||
import com.l2jmobius.gameserver.model.entity.Hero;
|
||||
import com.l2jmobius.gameserver.model.events.EventDispatcher;
|
||||
import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableAggroRangeEnter;
|
||||
@ -978,10 +978,10 @@ public class L2Attackable extends L2Npc
|
||||
|
||||
if (isSpoiled())
|
||||
{
|
||||
_sweepItems.set(npcTemplate.calculateDrops(DropListScope.CORPSE, this, player));
|
||||
_sweepItems.set(npcTemplate.calculateDrops(DropType.SPOIL, this, player));
|
||||
}
|
||||
|
||||
final Collection<ItemHolder> deathItems = npcTemplate.calculateDrops(DropListScope.DEATH, this, player);
|
||||
final Collection<ItemHolder> deathItems = npcTemplate.calculateDrops(DropType.DROP, this, player);
|
||||
if (deathItems != null)
|
||||
{
|
||||
for (ItemHolder drop : deathItems)
|
||||
|
@ -19,15 +19,17 @@ package com.l2jmobius.gameserver.model.actor.templates;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
import com.l2jmobius.commons.util.Rnd;
|
||||
import com.l2jmobius.gameserver.data.xml.impl.NpcData;
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.enums.AISkillScope;
|
||||
import com.l2jmobius.gameserver.enums.AIType;
|
||||
import com.l2jmobius.gameserver.enums.DropType;
|
||||
import com.l2jmobius.gameserver.enums.MpRewardAffectType;
|
||||
import com.l2jmobius.gameserver.enums.MpRewardType;
|
||||
import com.l2jmobius.gameserver.enums.Race;
|
||||
@ -35,11 +37,13 @@ import com.l2jmobius.gameserver.enums.Sex;
|
||||
import com.l2jmobius.gameserver.model.StatsSet;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.base.ClassId;
|
||||
import com.l2jmobius.gameserver.model.drops.DropListScope;
|
||||
import com.l2jmobius.gameserver.model.drops.IDropItem;
|
||||
import com.l2jmobius.gameserver.model.holders.DropHolder;
|
||||
import com.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import com.l2jmobius.gameserver.model.interfaces.IIdentifiable;
|
||||
import com.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
import com.l2jmobius.gameserver.util.Util;
|
||||
|
||||
/**
|
||||
* NPC template.
|
||||
@ -96,7 +100,8 @@ public final class L2NpcTemplate extends L2CharTemplate implements IIdentifiable
|
||||
private Map<AISkillScope, List<Skill>> _aiSkillLists;
|
||||
private Set<Integer> _clans;
|
||||
private Set<Integer> _ignoreClanNpcIds;
|
||||
private Map<DropListScope, List<IDropItem>> _dropLists;
|
||||
private List<DropHolder> _dropListDeath;
|
||||
private List<DropHolder> _dropListSpoil;
|
||||
private double _collisionRadiusGrown;
|
||||
private double _collisionHeightGrown;
|
||||
private int _mpRewardValue;
|
||||
@ -556,49 +561,222 @@ public final class L2NpcTemplate extends L2CharTemplate implements IIdentifiable
|
||||
_ignoreClanNpcIds = ignoreClanNpcIds != null ? Collections.unmodifiableSet(ignoreClanNpcIds) : null;
|
||||
}
|
||||
|
||||
public Map<DropListScope, List<IDropItem>> getDropLists()
|
||||
public void addDrop(DropHolder dropHolder)
|
||||
{
|
||||
return _dropLists;
|
||||
if (_dropListDeath == null)
|
||||
{
|
||||
_dropListDeath = new ArrayList<>();
|
||||
}
|
||||
_dropListDeath.add(dropHolder);
|
||||
}
|
||||
|
||||
public void setDropLists(Map<DropListScope, List<IDropItem>> dropLists)
|
||||
public void addSpoil(DropHolder dropHolder)
|
||||
{
|
||||
_dropLists = dropLists != null ? Collections.unmodifiableMap(dropLists) : null;
|
||||
if (_dropListSpoil == null)
|
||||
{
|
||||
_dropListSpoil = new ArrayList<>();
|
||||
}
|
||||
_dropListSpoil.add(dropHolder);
|
||||
}
|
||||
|
||||
public List<IDropItem> getDropList(DropListScope dropListScope)
|
||||
public List<DropHolder> getDropList(DropType dropType)
|
||||
{
|
||||
return _dropLists != null ? _dropLists.get(dropListScope) : null;
|
||||
switch (dropType)
|
||||
{
|
||||
case DROP:
|
||||
case LUCKY_DROP: // never happens
|
||||
{
|
||||
return _dropListDeath;
|
||||
}
|
||||
case SPOIL:
|
||||
{
|
||||
return _dropListSpoil;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Collection<ItemHolder> calculateDrops(DropListScope dropListScope, L2Character victim, L2Character killer)
|
||||
public Collection<ItemHolder> calculateDrops(DropType dropType, L2Character victim, L2Character killer)
|
||||
{
|
||||
final List<IDropItem> dropList = getDropList(dropListScope);
|
||||
final List<DropHolder> dropList = getDropList(dropType);
|
||||
if (dropList == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
final int levelDifference = victim.getLevel() - killer.getLevel();
|
||||
Collection<ItemHolder> calculatedDrops = null;
|
||||
for (IDropItem dropItem : dropList)
|
||||
for (DropHolder dropItem : dropList)
|
||||
{
|
||||
final Collection<ItemHolder> drops = dropItem.calculateDrops(victim, killer);
|
||||
if ((drops == null) || drops.isEmpty())
|
||||
// check level gap that may prevent drop this item
|
||||
final double levelGapChanceToDrop;
|
||||
if (dropItem.getItemId() == Inventory.ADENA_ID)
|
||||
{
|
||||
levelGapChanceToDrop = Util.map(levelDifference, -Config.DROP_ADENA_MAX_LEVEL_DIFFERENCE, -Config.DROP_ADENA_MIN_LEVEL_DIFFERENCE, Config.DROP_ADENA_MIN_LEVEL_GAP_CHANCE, 100.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
levelGapChanceToDrop = Util.map(levelDifference, -Config.DROP_ITEM_MAX_LEVEL_DIFFERENCE, -Config.DROP_ITEM_MIN_LEVEL_DIFFERENCE, Config.DROP_ITEM_MIN_LEVEL_GAP_CHANCE, 100.0);
|
||||
}
|
||||
if ((Rnd.nextDouble() * 100) > levelGapChanceToDrop)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (calculatedDrops == null)
|
||||
// calculate chances
|
||||
final ItemHolder drop = calculateDrop(dropItem, victim, killer);
|
||||
if (drop == null)
|
||||
{
|
||||
calculatedDrops = new LinkedList<>();
|
||||
continue;
|
||||
}
|
||||
|
||||
calculatedDrops.addAll(drops);
|
||||
// create list
|
||||
if (calculatedDrops == null)
|
||||
{
|
||||
calculatedDrops = new ArrayList<>();
|
||||
}
|
||||
|
||||
// finally
|
||||
calculatedDrops.add(drop);
|
||||
}
|
||||
|
||||
return calculatedDrops;
|
||||
}
|
||||
|
||||
/**
|
||||
* All item drop chance calculations are done by this method.
|
||||
* @param dropItem
|
||||
* @param victim
|
||||
* @param killer
|
||||
* @return ItemHolder
|
||||
*/
|
||||
private ItemHolder calculateDrop(DropHolder dropItem, L2Character victim, L2Character killer)
|
||||
{
|
||||
switch (dropItem.getDropType())
|
||||
{
|
||||
case DROP:
|
||||
case LUCKY_DROP:
|
||||
{
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(dropItem.getItemId());
|
||||
|
||||
// chance
|
||||
double rateChance = 1;
|
||||
if (Config.RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
rateChance *= Config.RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
rateChance *= Config.RATE_HERB_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else if (victim.isRaid())
|
||||
{
|
||||
rateChance *= Config.RATE_RAID_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
rateChance *= Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
|
||||
// premium chance
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && killer.getActingPlayer().hasPremiumStatus())
|
||||
{
|
||||
if (Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
rateChance *= Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
// TODO: Premium herb chance? :)
|
||||
}
|
||||
else if (victim.isRaid())
|
||||
{
|
||||
// TODO: Premium raid chance? :)
|
||||
}
|
||||
else
|
||||
{
|
||||
rateChance *= Config.PREMIUM_RATE_DROP_CHANCE;
|
||||
}
|
||||
}
|
||||
|
||||
// calculate if item will drop
|
||||
if ((Rnd.nextDouble() * 100) < (dropItem.getChance() * rateChance))
|
||||
{
|
||||
// amount is calculated after chance returned success
|
||||
double rateAmount = 1;
|
||||
if (Config.RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
rateAmount *= Config.RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
rateAmount *= Config.RATE_HERB_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else if (victim.isRaid())
|
||||
{
|
||||
rateAmount *= Config.RATE_RAID_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
rateAmount *= Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
|
||||
// premium chance
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && killer.getActingPlayer().hasPremiumStatus())
|
||||
{
|
||||
if (Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
// TODO: Premium herb amount? :)
|
||||
}
|
||||
else if (victim.isRaid())
|
||||
{
|
||||
// TODO: Premium raid amount? :)
|
||||
}
|
||||
else
|
||||
{
|
||||
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT;
|
||||
}
|
||||
}
|
||||
|
||||
// finally
|
||||
return new ItemHolder(dropItem.getItemId(), (long) (Rnd.get(dropItem.getMin(), dropItem.getMax()) * rateAmount));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPOIL:
|
||||
{
|
||||
// chance
|
||||
double rateChance = Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER;
|
||||
// premium chance
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && killer.getActingPlayer().hasPremiumStatus())
|
||||
{
|
||||
rateChance *= Config.PREMIUM_RATE_SPOIL_CHANCE;
|
||||
}
|
||||
|
||||
// calculate if item will be rewarded
|
||||
if ((Rnd.nextDouble() * 100) < (dropItem.getChance() * rateChance))
|
||||
{
|
||||
// amount is calculated after chance returned success
|
||||
double rateAmount = Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER;
|
||||
// premium amount
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && killer.getActingPlayer().hasPremiumStatus())
|
||||
{
|
||||
rateAmount *= Config.PREMIUM_RATE_SPOIL_AMOUNT;
|
||||
}
|
||||
|
||||
// finally
|
||||
return new ItemHolder(dropItem.getItemId(), (long) (Rnd.get(dropItem.getMin(), dropItem.getMax()) * rateAmount));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public double getCollisionRadiusGrown()
|
||||
{
|
||||
return _collisionRadiusGrown;
|
||||
|
@ -1,56 +0,0 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jmobius.gameserver.model.drops;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
|
||||
/**
|
||||
* @author NosBit
|
||||
*/
|
||||
public class CorpseDropItem extends GeneralDropItem
|
||||
{
|
||||
/**
|
||||
* @param itemId the item id
|
||||
* @param min the min count
|
||||
* @param max the max count
|
||||
* @param chance the chance of this drop item
|
||||
*/
|
||||
public CorpseDropItem(int itemId, long min, long max, double chance)
|
||||
{
|
||||
super(itemId, min, max, chance);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see com.l2jmobius.gameserver.model.drops.GeneralDropItem#getGlobalAmountMultiplier()
|
||||
*/
|
||||
@Override
|
||||
protected double getGlobalAmountMultiplier(boolean isPremium)
|
||||
{
|
||||
return isPremium ? Config.PREMIUM_RATE_SPOIL_AMOUNT * Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER : Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see com.l2jmobius.gameserver.model.drops.GeneralDropItem#getGlobalChanceMultiplier()
|
||||
*/
|
||||
@Override
|
||||
protected double getGlobalChanceMultiplier(boolean isPremium)
|
||||
{
|
||||
return isPremium ? Config.PREMIUM_RATE_SPOIL_CHANCE * Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER : Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jmobius.gameserver.model.drops;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
|
||||
/**
|
||||
* @author NosBit
|
||||
*/
|
||||
public class DeathDropItem extends GeneralDropItem
|
||||
{
|
||||
/**
|
||||
* @param itemId the item id
|
||||
* @param min the min count
|
||||
* @param max the max count
|
||||
* @param chance the chance of this drop item
|
||||
*/
|
||||
public DeathDropItem(int itemId, long min, long max, double chance)
|
||||
{
|
||||
super(itemId, min, max, chance);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see com.l2jmobius.gameserver.model.drops.GeneralDropItem#getGlobalAmountMultiplier()
|
||||
*/
|
||||
@Override
|
||||
protected double getGlobalAmountMultiplier(boolean isPremium)
|
||||
{
|
||||
return isPremium ? Config.PREMIUM_RATE_DROP_AMOUNT * Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER : Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see com.l2jmobius.gameserver.model.drops.GeneralDropItem#getGlobalChanceMultiplier()
|
||||
*/
|
||||
@Override
|
||||
protected double getGlobalChanceMultiplier(boolean isPremium)
|
||||
{
|
||||
return isPremium ? Config.PREMIUM_RATE_DROP_CHANCE * Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER : Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
}
|
@ -1,90 +0,0 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jmobius.gameserver.model.drops;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* @author NosBit
|
||||
*/
|
||||
public enum DropListScope
|
||||
{
|
||||
DEATH(DeathDropItem.class, GroupedDeathDropItem.class),
|
||||
CORPSE(CorpseDropItem.class, GroupedCorpseDropItem.class);
|
||||
|
||||
private static final Logger _log = Logger.getLogger(DropListScope.class.getName());
|
||||
|
||||
private final Class<? extends GeneralDropItem> _dropItemClass;
|
||||
private final Class<? extends GroupedGeneralDropItem> _groupedDropItemClass;
|
||||
|
||||
private DropListScope(Class<? extends GeneralDropItem> dropItemClass, Class<? extends GroupedGeneralDropItem> groupedDropItemClass)
|
||||
{
|
||||
_dropItemClass = dropItemClass;
|
||||
_groupedDropItemClass = groupedDropItemClass;
|
||||
}
|
||||
|
||||
public IDropItem newDropItem(int itemId, long min, long max, double chance)
|
||||
{
|
||||
final Constructor<? extends GeneralDropItem> constructor;
|
||||
try
|
||||
{
|
||||
constructor = _dropItemClass.getConstructor(int.class, long.class, long.class, double.class);
|
||||
}
|
||||
catch (NoSuchMethodException | SecurityException e)
|
||||
{
|
||||
_log.log(Level.SEVERE, "Constructor(int, long, long, double) not found for " + _dropItemClass.getSimpleName(), e);
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return constructor.newInstance(itemId, min, max, chance);
|
||||
}
|
||||
catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e)
|
||||
{
|
||||
_log.log(Level.SEVERE, "", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public GroupedGeneralDropItem newGroupedDropItem(double chance)
|
||||
{
|
||||
final Constructor<? extends GroupedGeneralDropItem> constructor;
|
||||
try
|
||||
{
|
||||
constructor = _groupedDropItemClass.getConstructor(double.class);
|
||||
}
|
||||
catch (NoSuchMethodException | SecurityException e)
|
||||
{
|
||||
_log.log(Level.SEVERE, "Constructor(double) not found for " + _groupedDropItemClass.getSimpleName(), e);
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return constructor.newInstance(chance);
|
||||
}
|
||||
catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e)
|
||||
{
|
||||
_log.log(Level.SEVERE, "", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,287 +0,0 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jmobius.gameserver.model.drops;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
import com.l2jmobius.commons.util.Rnd;
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import com.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.util.Util;
|
||||
|
||||
/**
|
||||
* @author NosBit
|
||||
*/
|
||||
public class GeneralDropItem implements IDropItem
|
||||
{
|
||||
private final int _itemId;
|
||||
private final long _min;
|
||||
private final long _max;
|
||||
private final double _chance;
|
||||
|
||||
/**
|
||||
* @param itemId the item id
|
||||
* @param min the min count
|
||||
* @param max the max count
|
||||
* @param chance the chance of this drop item
|
||||
*/
|
||||
public GeneralDropItem(int itemId, long min, long max, double chance)
|
||||
{
|
||||
_itemId = itemId;
|
||||
_min = min;
|
||||
_max = max;
|
||||
_chance = chance;
|
||||
}
|
||||
|
||||
protected double getGlobalChanceMultiplier(boolean isPremium)
|
||||
{
|
||||
return 1.;
|
||||
}
|
||||
|
||||
protected double getGlobalAmountMultiplier(boolean isPremium)
|
||||
{
|
||||
return 1.;
|
||||
}
|
||||
|
||||
private final long getMinMax(L2Character victim, L2Character killer, long val)
|
||||
{
|
||||
double multiplier = 1;
|
||||
|
||||
// individual drop amount
|
||||
Float individualDropAmountMultiplier = null;
|
||||
if (killer.getActingPlayer().hasPremiumStatus())
|
||||
{
|
||||
final Float normalMultiplier = Config.RATE_DROP_AMOUNT_BY_ID.get(getItemId());
|
||||
final Float premiumMultiplier = Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(getItemId());
|
||||
if ((normalMultiplier != null) && (premiumMultiplier != null))
|
||||
{
|
||||
individualDropAmountMultiplier = normalMultiplier * premiumMultiplier;
|
||||
}
|
||||
else if (normalMultiplier != null)
|
||||
{
|
||||
individualDropAmountMultiplier = normalMultiplier;
|
||||
}
|
||||
else if (premiumMultiplier != null)
|
||||
{
|
||||
individualDropAmountMultiplier = premiumMultiplier;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
individualDropAmountMultiplier = Config.RATE_DROP_AMOUNT_BY_ID.get(getItemId());
|
||||
}
|
||||
|
||||
if (individualDropAmountMultiplier != null)
|
||||
{
|
||||
// individual amount list multiplier
|
||||
multiplier *= individualDropAmountMultiplier;
|
||||
}
|
||||
else
|
||||
{
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(getItemId());
|
||||
// global amount multiplier
|
||||
if ((item != null) && item.hasExImmediateEffect())
|
||||
{
|
||||
// global herb amount multiplier
|
||||
multiplier *= Config.RATE_HERB_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else if (victim.isRaid())
|
||||
{
|
||||
// global raid amount multiplier
|
||||
multiplier *= Config.RATE_RAID_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
// drop type specific amount multiplier
|
||||
multiplier *= getGlobalAmountMultiplier(killer.getActingPlayer().hasPremiumStatus());
|
||||
}
|
||||
}
|
||||
|
||||
// global champions amount multiplier
|
||||
if (victim.isChampion())
|
||||
{
|
||||
multiplier *= getItemId() != Inventory.ADENA_ID ? Config.CHAMPION_REWARDS_AMOUNT : Config.CHAMPION_ADENAS_REWARDS_AMOUNT;
|
||||
}
|
||||
|
||||
return (long) (val * multiplier);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the item id
|
||||
* @return the item id
|
||||
*/
|
||||
public int getItemId()
|
||||
{
|
||||
return _itemId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the min drop count
|
||||
* @return the min
|
||||
*/
|
||||
public long getMin()
|
||||
{
|
||||
return _min;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the min drop count
|
||||
* @param victim the victim
|
||||
* @param killer the killer
|
||||
* @return the min modified by any rates.
|
||||
*/
|
||||
public long getMin(L2Character victim, L2Character killer)
|
||||
{
|
||||
return getMinMax(victim, killer, getMin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the max drop count
|
||||
* @return the max
|
||||
*/
|
||||
public long getMax()
|
||||
{
|
||||
return _max;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the max drop count
|
||||
* @param victim the victim
|
||||
* @param killer the killer
|
||||
* @return the max modified by any rates.
|
||||
*/
|
||||
public long getMax(L2Character victim, L2Character killer)
|
||||
{
|
||||
return getMinMax(victim, killer, getMax());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the chance of this drop item.
|
||||
* @return the chance
|
||||
*/
|
||||
public double getChance()
|
||||
{
|
||||
return _chance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the chance of this drop item.
|
||||
* @param victim the victim
|
||||
* @param killer the killer
|
||||
* @return the chance modified by any rates.
|
||||
*/
|
||||
public double getChance(L2Character victim, L2Character killer)
|
||||
{
|
||||
double multiplier = 1;
|
||||
|
||||
// individual drop chance
|
||||
Float individualDropChanceMultiplier = null;
|
||||
if (killer.getActingPlayer().hasPremiumStatus())
|
||||
{
|
||||
final Float normalMultiplier = Config.RATE_DROP_CHANCE_BY_ID.get(getItemId());
|
||||
final Float premiumMultiplier = Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(getItemId());
|
||||
if ((normalMultiplier != null) && (premiumMultiplier != null))
|
||||
{
|
||||
individualDropChanceMultiplier = normalMultiplier * premiumMultiplier;
|
||||
}
|
||||
else if (normalMultiplier != null)
|
||||
{
|
||||
individualDropChanceMultiplier = normalMultiplier;
|
||||
}
|
||||
else if (premiumMultiplier != null)
|
||||
{
|
||||
individualDropChanceMultiplier = premiumMultiplier;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
individualDropChanceMultiplier = Config.RATE_DROP_CHANCE_BY_ID.get(getItemId());
|
||||
}
|
||||
|
||||
if (individualDropChanceMultiplier != null)
|
||||
{
|
||||
multiplier *= individualDropChanceMultiplier;
|
||||
}
|
||||
else
|
||||
{
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(getItemId());
|
||||
if ((item != null) && item.hasExImmediateEffect())
|
||||
{
|
||||
multiplier *= Config.RATE_HERB_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else if (victim.isRaid())
|
||||
{
|
||||
// global raid chance multiplier
|
||||
multiplier *= Config.RATE_RAID_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
multiplier *= getGlobalChanceMultiplier(killer.getActingPlayer().hasPremiumStatus());
|
||||
}
|
||||
}
|
||||
|
||||
if (victim.isChampion())
|
||||
{
|
||||
multiplier *= getItemId() != Inventory.ADENA_ID ? Config.CHAMPION_REWARDS_CHANCE : Config.CHAMPION_ADENAS_REWARDS_CHANCE;
|
||||
}
|
||||
|
||||
return (getChance() * multiplier);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see com.l2jmobius.gameserver.model.drop.IDropItem#calculateDrops(com.l2jmobius.gameserver.model.actor.L2Character, com.l2jmobius.gameserver.model.actor.L2Character)
|
||||
*/
|
||||
@Override
|
||||
public Collection<ItemHolder> calculateDrops(L2Character victim, L2Character killer)
|
||||
{
|
||||
final int levelDifference = victim.getLevel() - killer.getLevel();
|
||||
final double levelGapChanceToDrop;
|
||||
if (getItemId() == Inventory.ADENA_ID)
|
||||
{
|
||||
levelGapChanceToDrop = Util.map(levelDifference, -Config.DROP_ADENA_MAX_LEVEL_DIFFERENCE, -Config.DROP_ADENA_MIN_LEVEL_DIFFERENCE, Config.DROP_ADENA_MIN_LEVEL_GAP_CHANCE, 100.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
levelGapChanceToDrop = Util.map(levelDifference, -Config.DROP_ITEM_MAX_LEVEL_DIFFERENCE, -Config.DROP_ITEM_MIN_LEVEL_DIFFERENCE, Config.DROP_ITEM_MIN_LEVEL_GAP_CHANCE, 100.0);
|
||||
}
|
||||
|
||||
// There is a chance of level gap that it wont drop this item
|
||||
if (levelGapChanceToDrop < (Rnd.nextDouble() * 100))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
final double chance = getChance(victim, killer);
|
||||
final boolean successes = chance > (Rnd.nextDouble() * 100);
|
||||
if (successes)
|
||||
{
|
||||
final Collection<ItemHolder> items = new ArrayList<>(1);
|
||||
final long baseDropCount = Rnd.get(getMin(victim, killer), getMax(victim, killer));
|
||||
final long finaldropCount = (long) (Config.OLD_DROP_BEHAVIOR ? (baseDropCount * Math.max(1, chance / 100)) + (chance > 100 ? (chance % 100) > (Rnd.nextDouble() * 100) ? baseDropCount : 0 : 0) : baseDropCount);
|
||||
items.add(new ItemHolder(getItemId(), finaldropCount));
|
||||
return items;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jmobius.gameserver.model.drops;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
|
||||
/**
|
||||
* @author NosBit
|
||||
*/
|
||||
public class GroupedCorpseDropItem extends GroupedGeneralDropItem
|
||||
{
|
||||
/**
|
||||
* @param chance the chance of this drop item.
|
||||
*/
|
||||
public GroupedCorpseDropItem(double chance)
|
||||
{
|
||||
super(chance);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see com.l2jmobius.gameserver.model.drops.GroupedGeneralDropItem#getGlobalChanceMultiplier()
|
||||
*/
|
||||
@Override
|
||||
protected double getGlobalChanceMultiplier()
|
||||
{
|
||||
return Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jmobius.gameserver.model.drops;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
|
||||
/**
|
||||
* @author NosBit
|
||||
*/
|
||||
public class GroupedDeathDropItem extends GroupedGeneralDropItem
|
||||
{
|
||||
/**
|
||||
* @param chance the chance of this drop item.
|
||||
*/
|
||||
public GroupedDeathDropItem(double chance)
|
||||
{
|
||||
super(chance);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see com.l2jmobius.gameserver.model.drops.GroupedGeneralDropItem#getGlobalChanceMultiplier()
|
||||
*/
|
||||
@Override
|
||||
protected double getGlobalChanceMultiplier()
|
||||
{
|
||||
return Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
}
|
@ -1,179 +0,0 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jmobius.gameserver.model.drops;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
import com.l2jmobius.commons.util.Rnd;
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2RaidBossInstance;
|
||||
import com.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.util.Util;
|
||||
|
||||
/**
|
||||
* @author NosBit
|
||||
*/
|
||||
public class GroupedGeneralDropItem implements IDropItem
|
||||
{
|
||||
private final double _chance;
|
||||
private List<GeneralDropItem> _items;
|
||||
|
||||
/**
|
||||
* @param chance the chance of this drop item.
|
||||
*/
|
||||
public GroupedGeneralDropItem(double chance)
|
||||
{
|
||||
_chance = chance;
|
||||
}
|
||||
|
||||
protected double getGlobalChanceMultiplier()
|
||||
{
|
||||
return 1.;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the chance of this drop item.
|
||||
* @return the chance
|
||||
*/
|
||||
public double getChance()
|
||||
{
|
||||
return _chance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the chance of this drop item.
|
||||
* @param victim the victim
|
||||
* @param killer the killer
|
||||
* @return the chance modified by any rates.
|
||||
*/
|
||||
public double getChance(L2Character victim, L2Character killer)
|
||||
{
|
||||
for (GeneralDropItem gdi : getItems())
|
||||
{
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(gdi.getItemId());
|
||||
if (item == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (!item.hasExImmediateEffect())
|
||||
{
|
||||
// individual chance
|
||||
Float individualDropChanceMultiplier = null;
|
||||
if (killer.getActingPlayer().hasPremiumStatus())
|
||||
{
|
||||
final Float normalMultiplier = Config.RATE_DROP_CHANCE_BY_ID.get(item.getId());
|
||||
final Float premiumMultiplier = Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(item.getId());
|
||||
if ((normalMultiplier != null) && (premiumMultiplier != null))
|
||||
{
|
||||
individualDropChanceMultiplier = normalMultiplier * premiumMultiplier;
|
||||
}
|
||||
else if (normalMultiplier != null)
|
||||
{
|
||||
individualDropChanceMultiplier = normalMultiplier;
|
||||
}
|
||||
else if (premiumMultiplier != null)
|
||||
{
|
||||
individualDropChanceMultiplier = premiumMultiplier;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
individualDropChanceMultiplier = Config.RATE_DROP_CHANCE_BY_ID.get(item.getId());
|
||||
}
|
||||
if (individualDropChanceMultiplier != null)
|
||||
{
|
||||
return getChance() * individualDropChanceMultiplier;
|
||||
}
|
||||
|
||||
return getChance() * getGlobalChanceMultiplier();
|
||||
}
|
||||
}
|
||||
|
||||
return getChance() * Config.RATE_HERB_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the items.
|
||||
* @return the items
|
||||
*/
|
||||
public List<GeneralDropItem> getItems()
|
||||
{
|
||||
return _items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets an item list to this drop item.
|
||||
* @param items the item list
|
||||
*/
|
||||
public void setItems(List<GeneralDropItem> items)
|
||||
{
|
||||
_items = Collections.unmodifiableList(items);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
* @see com.l2jmobius.gameserver.model.drop.IDropItem#calculateDrops(com.l2jmobius.gameserver.model.actor.L2Character, com.l2jmobius.gameserver.model.actor.L2Character)
|
||||
*/
|
||||
@Override
|
||||
public Collection<ItemHolder> calculateDrops(L2Character victim, L2Character killer)
|
||||
{
|
||||
final int levelDifference = victim.getLevel() - killer.getLevel();
|
||||
double chanceModifier;
|
||||
if (victim instanceof L2RaidBossInstance)
|
||||
{
|
||||
chanceModifier = Math.max(0, Math.min(1, (levelDifference * 0.15) + 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
chanceModifier = 1;
|
||||
if (Util.map(levelDifference, -Config.DROP_ITEM_MAX_LEVEL_DIFFERENCE, -Config.DROP_ITEM_MIN_LEVEL_DIFFERENCE, Config.DROP_ITEM_MIN_LEVEL_GAP_CHANCE, 100.0) < (Rnd.nextDouble() * 100))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
final double chance = getChance(victim, killer) * chanceModifier;
|
||||
final boolean successes = chance > (Rnd.nextDouble() * 100);
|
||||
|
||||
if (successes)
|
||||
{
|
||||
double totalChance = 0;
|
||||
final double random = (Rnd.nextDouble() * 100);
|
||||
for (GeneralDropItem item : getItems())
|
||||
{
|
||||
// Grouped item chance rates should not be modified.
|
||||
totalChance += item.getChance(victim, killer);
|
||||
if (totalChance > random)
|
||||
{
|
||||
final Collection<ItemHolder> items = new ArrayList<>(1);
|
||||
final long baseDropCount = Rnd.get(item.getMin(victim, killer), item.getMax(victim, killer));
|
||||
final long finaldropCount = (long) (Config.OLD_DROP_BEHAVIOR ? (baseDropCount * Math.max(1, chance / 100)) + ((chance > 100) && ((chance % 100) > (Rnd.nextDouble() * 100)) ? baseDropCount : 0) : baseDropCount);
|
||||
items.add(new ItemHolder(item.getItemId(), finaldropCount));
|
||||
return items;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* This file is part of the L2J Mobius project.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.l2jmobius.gameserver.model.holders;
|
||||
|
||||
import com.l2jmobius.gameserver.enums.DropType;
|
||||
|
||||
/**
|
||||
* @author Mobius
|
||||
*/
|
||||
public class DropHolder
|
||||
{
|
||||
private final DropType _dropType;
|
||||
private final int _itemId;
|
||||
private final long _min;
|
||||
private final long _max;
|
||||
private final double _chance;
|
||||
|
||||
public DropHolder(DropType dropType, int itemId, long min, long max, double chance)
|
||||
{
|
||||
_dropType = dropType;
|
||||
_itemId = itemId;
|
||||
_min = min;
|
||||
_max = max;
|
||||
_chance = chance;
|
||||
}
|
||||
|
||||
public DropType getDropType()
|
||||
{
|
||||
return _dropType;
|
||||
}
|
||||
|
||||
public int getItemId()
|
||||
{
|
||||
return _itemId;
|
||||
}
|
||||
|
||||
public long getMin()
|
||||
{
|
||||
return _min;
|
||||
}
|
||||
|
||||
public long getMax()
|
||||
{
|
||||
return _max;
|
||||
}
|
||||
|
||||
public double getChance()
|
||||
{
|
||||
return _chance;
|
||||
}
|
||||
}
|
@ -36,7 +36,7 @@ import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.instancemanager.EventShrineManager;
|
||||
import com.l2jmobius.gameserver.model.Location;
|
||||
import com.l2jmobius.gameserver.model.announce.EventAnnouncement;
|
||||
import com.l2jmobius.gameserver.model.drops.GeneralDropItem;
|
||||
import com.l2jmobius.gameserver.model.holders.DropHolder;
|
||||
import com.l2jmobius.gameserver.script.DateRange;
|
||||
import com.l2jmobius.gameserver.util.Broadcast;
|
||||
|
||||
@ -62,7 +62,7 @@ public class LongTimeEvent extends Quest
|
||||
protected final List<NpcSpawn> _spawnList = new ArrayList<>();
|
||||
|
||||
// Drop data for event
|
||||
protected final List<GeneralDropItem> _dropList = new ArrayList<>();
|
||||
protected final List<DropHolder> _dropList = new ArrayList<>();
|
||||
|
||||
protected class NpcSpawn
|
||||
{
|
||||
@ -195,7 +195,7 @@ public class LongTimeEvent extends Quest
|
||||
continue;
|
||||
}
|
||||
|
||||
_dropList.add(new GeneralDropItem(itemId, minCount, maxCount, finalChance));
|
||||
_dropList.add(new DropHolder(null, itemId, minCount, maxCount, finalChance));
|
||||
}
|
||||
catch (NumberFormatException nfe)
|
||||
{
|
||||
@ -272,7 +272,7 @@ public class LongTimeEvent extends Quest
|
||||
// Add drop
|
||||
if (_dropList != null)
|
||||
{
|
||||
for (GeneralDropItem drop : _dropList)
|
||||
for (DropHolder drop : _dropList)
|
||||
{
|
||||
EventDroplist.getInstance().addGlobalDrop(drop.getItemId(), drop.getMin(), drop.getMax(), (int) drop.getChance(), _dropPeriod);
|
||||
}
|
||||
|
@ -92,6 +92,7 @@ Others:
|
||||
-Reworked tax system
|
||||
-Reworked quest system
|
||||
-Reworked spawn system
|
||||
-Reworked drop system
|
||||
-Skill system from L2jUnity
|
||||
-GeoEngine from aCis
|
||||
-Threadpool manager from aCis
|
||||
|
@ -1,10 +0,0 @@
|
||||
# ---------------------------------------------------------------------------
|
||||
# Old Drop Behavior
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# Enables L2J old drop behavior
|
||||
# The old L2J system used to add amount of items drop per 100% range of chance.
|
||||
# For example, if chance is 230% when rate are applied, it will do :
|
||||
# amount dropped = (2 * getRandomAmount(min,max)) + 30% chance to get ad additional getRandomAmount(min,max)
|
||||
# Default : False
|
||||
OldDropBehavior = False
|
@ -229,11 +229,6 @@ AutoDeleteInvalidQuestData = False
|
||||
# Retail: True
|
||||
StoryQuestRewardBuff = True
|
||||
|
||||
# If True, allows a special handling for drops when chance raises over 100% (eg. when applying chance rates).
|
||||
# True value causes better drop handling at higher rates.
|
||||
# Default: True
|
||||
PreciseDropCalculation = True
|
||||
|
||||
# Allow creating multiple non-stackable items at one time?
|
||||
# Default: True
|
||||
MultipleItemDrop = True
|
||||
|
@ -174,36 +174,6 @@ GrandChaosTime = 10
|
||||
MinionChaosTime = 10
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Drops
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# The min and max level difference used for level gap calculation
|
||||
# this is only for how many levels higher the player is than the monster
|
||||
# Default: 8
|
||||
DropAdenaMinLevelDifference = 8
|
||||
# Default: 15
|
||||
DropAdenaMaxLevelDifference = 15
|
||||
|
||||
# This is the minimum level gap chance meaning for 10 that the monster will have 10% chance
|
||||
# to allow dropping the item if level difference is bigger than DropAdenaMaxLevelDifference
|
||||
# Note: This value is scalling from 100 to the specified value for DropAdenaMinLevelDifference to DropAdenaMaxLevelDifference limits
|
||||
# Default: 10
|
||||
DropAdenaMinLevelGapChance = 10
|
||||
|
||||
# The min and max level difference used for level gap calculation
|
||||
# this is only for how many levels higher the player is than the monster
|
||||
# Default: 5
|
||||
DropItemMinLevelDifference = 5
|
||||
# Default: 10
|
||||
DropItemMaxLevelDifference = 10
|
||||
|
||||
# This is the minimum level gap chance meaning for 10 that the monster will have 10% chance
|
||||
# to allow dropping the item if level difference is bigger than DropAdenaMaxLevelDifference
|
||||
# Note: This value is scalling from 100 to the specified value for DropAdenaMinLevelDifference to DropAdenaMaxLevelDifference limits
|
||||
# Default: 10
|
||||
DropItemMinLevelGapChance = 10
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Vitality
|
||||
# ---------------------------------------------------------------------------
|
||||
|
@ -5,39 +5,6 @@
|
||||
# Warning:
|
||||
# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Item Rates
|
||||
# ---------------------------------------------------------------------------
|
||||
# Warning: to achieve old l2j behavior before drops rework you need to enable OldDropBehavior in Custom.ini
|
||||
# and increase only chance multipliers! Remember if you increase both chance and amount you will have higher rates than expected
|
||||
# Example: if amount multiplier is 5 and chance multiplier is 5 you will end up with 5*5 = 25 drop rates so be careful!
|
||||
|
||||
# Multiplies the amount of items dropped from monster on ground when it dies.
|
||||
DeathDropAmountMultiplier = 1
|
||||
# Multiplies the amount of items looted from monster when a skill like Sweeper(Spoil) is used.
|
||||
CorpseDropAmountMultiplier = 1
|
||||
# Multiplies the amount of items dropped from monster on ground when it dies.
|
||||
HerbDropAmountMultiplier = 1
|
||||
RaidDropAmountMultiplier = 1
|
||||
|
||||
# Multiplies the chance of items that can be dropped from monster on ground when it dies.
|
||||
DeathDropChanceMultiplier = 1
|
||||
# Multiplies the chance of items that can be looted from monster when a skill like Sweeper(Spoil) is used.
|
||||
CorpseDropChanceMultiplier = 1
|
||||
# Multiplies the chance of items that can be dropped from monster on ground when it dies.
|
||||
HerbDropChanceMultiplier = 1
|
||||
RaidDropChanceMultiplier = 1
|
||||
|
||||
# List of items affected by custom drop rate by id, used now for Adena rate too.
|
||||
# Usage: itemId1,multiplier1;itemId2,multiplier2;...
|
||||
# Note: Make sure the lists do NOT CONTAIN trailing spaces or spaces between the numbers!
|
||||
# Example for Raid boss 1x jewelry: 6656,1;6657,1;6658,1;6659,1;6660,1;6661,1;6662,1;8191,1;10170,1;10314,1;
|
||||
# Default: 57,1
|
||||
DropAmountMultiplierByItemId = 57,1
|
||||
DropChanceMultiplierByItemId = 57,1
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Standard Settings (Retail value = 1)
|
||||
# ---------------------------------------------------------------------------
|
||||
@ -109,6 +76,68 @@ RateQuestRewardRecipe = 1
|
||||
RateQuestRewardMaterial = 1
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Item Drop Rates
|
||||
# ---------------------------------------------------------------------------
|
||||
# Remember if you increase both chance and amount you will have higher rates than expected.
|
||||
# Example: if amount multiplier is 5 and chance multiplier is 5 you will end up with 5*5 = 25 drop rates so be careful!
|
||||
|
||||
# Multiplies the amount of items rewarded from monsters when they die.
|
||||
DeathDropAmountMultiplier = 1
|
||||
# Multiplies the amount of items rewarded from monsters when a Spoil skill is used.
|
||||
SpoilDropAmountMultiplier = 1
|
||||
# Multiplies the amount of items rewarded from monsters when they die.
|
||||
HerbDropAmountMultiplier = 1
|
||||
RaidDropAmountMultiplier = 1
|
||||
|
||||
# Multiplies the chance of items that can be rewarded from monsters when they die.
|
||||
DeathDropChanceMultiplier = 1
|
||||
# Multiplies the chance of items that can be rewarded from monsters when a Spoil skill is used.
|
||||
SpoilDropChanceMultiplier = 1
|
||||
# Multiplies the chance of items that can be rewarded from monsters when they die.
|
||||
HerbDropChanceMultiplier = 1
|
||||
RaidDropChanceMultiplier = 1
|
||||
|
||||
# List of items affected by custom drop rate by id, used now for Adena rate too.
|
||||
# Usage: itemId1,multiplier1;itemId2,multiplier2;...
|
||||
# Note: Make sure the lists do NOT CONTAIN trailing spaces or spaces between the numbers!
|
||||
# Example for Raid boss 1x jewelry: 6656,1;6657,1;6658,1;6659,1;6660,1;6661,1;6662,1;8191,1;10170,1;10314,1;
|
||||
# Default: 57,1
|
||||
DropAmountMultiplierByItemId = 57,1
|
||||
DropChanceMultiplierByItemId = 57,1
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Item Drop Level Difference Settings
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# The min and max level difference used for level gap calculation
|
||||
# this is only for how many levels higher the player is than the monster
|
||||
# Default: 8
|
||||
DropAdenaMinLevelDifference = 8
|
||||
# Default: 15
|
||||
DropAdenaMaxLevelDifference = 15
|
||||
|
||||
# This is the minimum level gap chance meaning for 10 that the monster will have 10% chance
|
||||
# to allow dropping the item if level difference is bigger than DropAdenaMaxLevelDifference
|
||||
# Note: This value is scalling from 100 to the specified value for DropAdenaMinLevelDifference to DropAdenaMaxLevelDifference limits
|
||||
# Default: 10
|
||||
DropAdenaMinLevelGapChance = 10
|
||||
|
||||
# The min and max level difference used for level gap calculation
|
||||
# this is only for how many levels higher the player is than the monster
|
||||
# Default: 5
|
||||
DropItemMinLevelDifference = 5
|
||||
# Default: 10
|
||||
DropItemMaxLevelDifference = 10
|
||||
|
||||
# This is the minimum level gap chance meaning for 10 that the monster will have 10% chance
|
||||
# to allow dropping the item if level difference is bigger than DropAdenaMaxLevelDifference
|
||||
# Note: This value is scalling from 100 to the specified value for DropAdenaMinLevelDifference to DropAdenaMaxLevelDifference limits
|
||||
# Default: 10
|
||||
DropItemMinLevelGapChance = 10
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Vitality system rates. Works only if EnableVitality = True
|
||||
# ---------------------------------------------------------------------------
|
||||
|
@ -265,7 +265,7 @@ public class AdminAdmin implements IAdminCommandHandler
|
||||
}
|
||||
case "RateDropSpoil":
|
||||
{
|
||||
Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER = Float.valueOf(pValue);
|
||||
Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER = Float.valueOf(pValue);
|
||||
break;
|
||||
}
|
||||
case "EnchantChanceElementStone":
|
||||
@ -462,7 +462,7 @@ public class AdminAdmin implements IAdminCommandHandler
|
||||
replyMSG.append("<tr><td><font color=\"00AA00\">Drop:</font></td><td></td><td></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"LEVEL\">Rate EXP</font> = " + Config.RATE_XP + "</td><td><edit var=\"param1\" width=40 height=15></td><td><button value=\"Set\" action=\"bypass -h admin_setconfig RateXp $param1\" width=40 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"LEVEL\">Rate SP</font> = " + Config.RATE_SP + "</td><td><edit var=\"param2\" width=40 height=15></td><td><button value=\"Set\" action=\"bypass -h admin_setconfig RateSp $param2\" width=40 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"LEVEL\">Rate Drop Spoil</font> = " + Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER + "</td><td><edit var=\"param4\" width=40 height=15></td><td><button value=\"Set\" action=\"bypass -h admin_setconfig RateDropSpoil $param4\" width=40 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"LEVEL\">Rate Drop Spoil</font> = " + Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER + "</td><td><edit var=\"param4\" width=40 height=15></td><td><button value=\"Set\" action=\"bypass -h admin_setconfig RateDropSpoil $param4\" width=40 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
replyMSG.append("<tr><td width=140></td><td width=40></td><td width=40></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"00AA00\">Enchant:</font></td><td></td><td></td></tr>");
|
||||
replyMSG.append("<tr><td><font color=\"LEVEL\">Enchant Element Stone</font> = " + Config.ENCHANT_CHANCE_ELEMENT_STONE + "</td><td><edit var=\"param8\" width=40 height=15></td><td><button value=\"Set\" action=\"bypass -h admin_setconfig EnchantChanceElementStone $param8\" width=40 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>");
|
||||
|
@ -18,14 +18,15 @@ package handlers.bypasshandlers;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
import com.l2jmobius.commons.util.CommonUtil;
|
||||
import com.l2jmobius.gameserver.cache.HtmCache;
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.enums.AttributeType;
|
||||
import com.l2jmobius.gameserver.enums.DropType;
|
||||
import com.l2jmobius.gameserver.handler.IBypassHandler;
|
||||
import com.l2jmobius.gameserver.model.L2Object;
|
||||
import com.l2jmobius.gameserver.model.L2Spawn;
|
||||
@ -34,10 +35,7 @@ import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Character;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.drops.DropListScope;
|
||||
import com.l2jmobius.gameserver.model.drops.GeneralDropItem;
|
||||
import com.l2jmobius.gameserver.model.drops.GroupedGeneralDropItem;
|
||||
import com.l2jmobius.gameserver.model.drops.IDropItem;
|
||||
import com.l2jmobius.gameserver.model.holders.DropHolder;
|
||||
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
|
||||
import com.l2jmobius.gameserver.util.HtmlUtil;
|
||||
@ -106,10 +104,10 @@ public class NpcViewMod implements IBypassHandler
|
||||
return false;
|
||||
}
|
||||
|
||||
final String dropListScopeString = st.nextToken();
|
||||
final String dropListTypeString = st.nextToken();
|
||||
try
|
||||
{
|
||||
final DropListScope dropListScope = Enum.valueOf(DropListScope.class, dropListScopeString);
|
||||
final DropType dropListType = Enum.valueOf(DropType.class, dropListTypeString);
|
||||
final L2Object target = L2World.getInstance().findObject(Integer.parseInt(st.nextToken()));
|
||||
final L2Npc npc = target instanceof L2Npc ? (L2Npc) target : null;
|
||||
if (npc == null)
|
||||
@ -117,7 +115,7 @@ public class NpcViewMod implements IBypassHandler
|
||||
return false;
|
||||
}
|
||||
final int page = st.hasMoreElements() ? Integer.parseInt(st.nextToken()) : 0;
|
||||
sendNpcDropList(activeChar, npc, dropListScope, page);
|
||||
sendNpcDropList(activeChar, npc, dropListType, page);
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
@ -125,7 +123,7 @@ public class NpcViewMod implements IBypassHandler
|
||||
}
|
||||
catch (IllegalArgumentException e)
|
||||
{
|
||||
_log.warning("Bypass[NpcViewMod] unknown drop list scope: " + dropListScopeString);
|
||||
_log.warning("Bypass[NpcViewMod] unknown drop list scope: " + dropListTypeString);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
@ -336,21 +334,22 @@ public class NpcViewMod implements IBypassHandler
|
||||
activeChar.sendPacket(html);
|
||||
}
|
||||
|
||||
public static String getDropListButtons(L2Npc npc)
|
||||
private static String getDropListButtons(L2Npc npc)
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final Map<DropListScope, List<IDropItem>> dropLists = npc.getTemplate().getDropLists();
|
||||
if ((dropLists != null) && !dropLists.isEmpty() && (dropLists.containsKey(DropListScope.DEATH) || dropLists.containsKey(DropListScope.CORPSE)))
|
||||
final List<DropHolder> dropListDeath = npc.getTemplate().getDropList(DropType.DROP);
|
||||
final List<DropHolder> dropListSpoil = npc.getTemplate().getDropList(DropType.SPOIL);
|
||||
if ((dropListDeath != null) || (dropListSpoil != null))
|
||||
{
|
||||
sb.append("<table width=275 cellpadding=0 cellspacing=0><tr>");
|
||||
if (dropLists.containsKey(DropListScope.DEATH))
|
||||
if (dropListDeath != null)
|
||||
{
|
||||
sb.append("<td align=center><button value=\"Show Drop\" width=100 height=25 action=\"bypass NpcViewMod dropList DEATH " + npc.getObjectId() + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
sb.append("<td align=center><button value=\"Show Drop\" width=100 height=25 action=\"bypass NpcViewMod dropList DROP " + npc.getObjectId() + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
}
|
||||
|
||||
if (dropLists.containsKey(DropListScope.CORPSE))
|
||||
if (dropListSpoil != null)
|
||||
{
|
||||
sb.append("<td align=center><button value=\"Show Spoil\" width=100 height=25 action=\"bypass NpcViewMod dropList CORPSE " + npc.getObjectId() + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
sb.append("<td align=center><button value=\"Show Spoil\" width=100 height=25 action=\"bypass NpcViewMod dropList SPOIL " + npc.getObjectId() + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
}
|
||||
|
||||
sb.append("</tr></table>");
|
||||
@ -358,10 +357,10 @@ public class NpcViewMod implements IBypassHandler
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static void sendNpcDropList(L2PcInstance activeChar, L2Npc npc, DropListScope dropListScope, int page)
|
||||
private static void sendNpcDropList(L2PcInstance activeChar, L2Npc npc, DropType dropType, int page)
|
||||
{
|
||||
final List<IDropItem> dropList = npc.getTemplate().getDropList(dropListScope);
|
||||
if ((dropList == null) || dropList.isEmpty())
|
||||
final List<DropHolder> dropList = npc.getTemplate().getDropList(dropType);
|
||||
if (dropList == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -378,7 +377,7 @@ public class NpcViewMod implements IBypassHandler
|
||||
pagesSb.append("<table><tr>");
|
||||
for (int i = 0; i < pages; i++)
|
||||
{
|
||||
pagesSb.append("<td align=center><button value=\"" + (i + 1) + "\" width=20 height=20 action=\"bypass NpcViewMod dropList " + dropListScope + " " + npc.getObjectId() + " " + i + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
pagesSb.append("<td align=center><button value=\"" + (i + 1) + "\" width=20 height=20 action=\"bypass NpcViewMod dropList " + dropType + " " + npc.getObjectId() + " " + i + "\" back=\"L2UI_CT1.Button_DF_Calculator_Down\" fore=\"L2UI_CT1.Button_DF_Calculator\"></td>");
|
||||
}
|
||||
pagesSb.append("</tr></table>");
|
||||
}
|
||||
@ -409,124 +408,126 @@ public class NpcViewMod implements IBypassHandler
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
|
||||
int height = 64;
|
||||
final IDropItem dropItem = dropList.get(i);
|
||||
if (dropItem instanceof GeneralDropItem)
|
||||
final DropHolder dropItem = dropList.get(i);
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(dropItem.getItemId());
|
||||
|
||||
// real time server rate calculations
|
||||
double rateChance = 1;
|
||||
double rateAmount = 1;
|
||||
if (dropType == DropType.SPOIL)
|
||||
{
|
||||
final GeneralDropItem generalDropItem = (GeneralDropItem) dropItem;
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(generalDropItem.getItemId());
|
||||
sb.append("<table width=332 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
|
||||
sb.append("<tr><td width=32 valign=top>");
|
||||
sb.append("<img src=\"" + item.getIcon() + "\" width=32 height=32>");
|
||||
sb.append("</td><td fixwidth=300 align=center><font name=\"hs9\" color=\"CD9000\">");
|
||||
sb.append(item.getName());
|
||||
sb.append("</font></td></tr><tr><td width=32></td><td width=300><table width=295 cellpadding=0 cellspacing=0>");
|
||||
sb.append("<tr><td width=48 align=right valign=top><font color=\"LEVEL\">Amount:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
rateChance = Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER;
|
||||
rateAmount = Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER;
|
||||
|
||||
final long min = generalDropItem.getMin(npc, activeChar);
|
||||
final long max = generalDropItem.getMax(npc, activeChar);
|
||||
if (min == max)
|
||||
// also check premium rates if available
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && activeChar.hasPremiumStatus())
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
rateChance *= Config.PREMIUM_RATE_SPOIL_CHANCE;
|
||||
rateAmount *= Config.PREMIUM_RATE_SPOIL_AMOUNT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Config.RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
rateChance *= Config.RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
rateChance *= Config.RATE_HERB_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else if (npc.isRaid())
|
||||
{
|
||||
rateChance *= Config.RATE_RAID_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
sb.append(" - ");
|
||||
sb.append(amountFormat.format(max));
|
||||
rateChance *= Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
|
||||
sb.append("</td></tr><tr><td width=48 align=right valign=top><font color=\"LEVEL\">Chance:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
sb.append(chanceFormat.format(Math.min(generalDropItem.getChance(npc, activeChar), 100)));
|
||||
sb.append("%</td></tr></table></td></tr><tr><td width=32></td><td width=300> </td></tr></table>");
|
||||
}
|
||||
else if (dropItem instanceof GroupedGeneralDropItem)
|
||||
{
|
||||
final GroupedGeneralDropItem generalGroupedDropItem = (GroupedGeneralDropItem) dropItem;
|
||||
if (generalGroupedDropItem.getItems().size() == 1)
|
||||
if (Config.RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
final GeneralDropItem generalDropItem = generalGroupedDropItem.getItems().get(0);
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(generalDropItem.getItemId());
|
||||
sb.append("<table width=332 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
|
||||
sb.append("<tr><td width=32 valign=top>");
|
||||
sb.append("<img src=\"" + item.getIcon() + "\" width=32 height=32>");
|
||||
sb.append("</td><td fixwidth=300 align=center><font name=\"hs9\" color=\"CD9000\">");
|
||||
sb.append(item.getName());
|
||||
sb.append("</font></td></tr><tr><td width=32></td><td width=300><table width=295 cellpadding=0 cellspacing=0>");
|
||||
sb.append("<tr><td width=48 align=right valign=top><font color=\"LEVEL\">Amount:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
|
||||
final long min = generalDropItem.getMin(npc, activeChar);
|
||||
final long max = generalDropItem.getMax(npc, activeChar);
|
||||
if (min == max)
|
||||
rateAmount *= Config.RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
rateAmount *= Config.RATE_HERB_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else if (npc.isRaid())
|
||||
{
|
||||
rateAmount *= Config.RATE_RAID_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
rateAmount *= Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
|
||||
// also check premium rates if available
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && activeChar.hasPremiumStatus())
|
||||
{
|
||||
if (Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
rateChance *= Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
// TODO: Premium herb chance? :)
|
||||
}
|
||||
else if (npc.isRaid())
|
||||
{
|
||||
// TODO: Premium raid chance? :)
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
sb.append(" - ");
|
||||
sb.append(amountFormat.format(max));
|
||||
rateChance *= Config.PREMIUM_RATE_DROP_CHANCE;
|
||||
}
|
||||
|
||||
sb.append("</td></tr><tr><td width=48 align=right valign=top><font color=\"LEVEL\">Chance:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
sb.append(chanceFormat.format(Math.min(generalGroupedDropItem.getChance(npc, activeChar), 100)));
|
||||
sb.append("%</td></tr></table></td></tr><tr><td width=32></td><td width=300> </td></tr></table>");
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append("<table width=332 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
|
||||
sb.append("<tr><td width=32 valign=top><img src=\"L2UI_CT1.ICON_DF_premiumItem\" width=32 height=32></td>");
|
||||
sb.append("<td fixwidth=300 align=center><font name=\"ScreenMessageSmall\" color=\"CD9000\">One from group</font>");
|
||||
sb.append("</td></tr><tr><td width=32></td><td width=300><table width=295 cellpadding=0 cellspacing=0><tr>");
|
||||
sb.append("<td width=48 align=right valign=top><font color=\"LEVEL\">Chance:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
sb.append(chanceFormat.format(Math.min(generalGroupedDropItem.getChance(npc, activeChar), 100)));
|
||||
sb.append("%</td></tr></table><br>");
|
||||
|
||||
for (GeneralDropItem generalDropItem : generalGroupedDropItem.getItems())
|
||||
if (Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId()) != null)
|
||||
{
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(generalDropItem.getItemId());
|
||||
sb.append("<table width=291 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
|
||||
sb.append("<tr><td width=32 valign=top>");
|
||||
String icon = item.getIcon();
|
||||
if (icon == null)
|
||||
{
|
||||
icon = "icon.etc_question_mark_i00";
|
||||
}
|
||||
sb.append("<img src=\"" + icon + "\" width=32 height=32>");
|
||||
sb.append("</td><td fixwidth=259 align=center><font name=\"hs9\" color=\"CD9000\">");
|
||||
sb.append(item.getName());
|
||||
sb.append("</font></td></tr><tr><td width=32></td><td width=259><table width=253 cellpadding=0 cellspacing=0>");
|
||||
sb.append("<tr><td width=48 align=right valign=top><font color=\"LEVEL\">Amount:</font></td><td width=205 align=center>");
|
||||
|
||||
final long min = generalDropItem.getMin(npc, activeChar);
|
||||
final long max = generalDropItem.getMax(npc, activeChar);
|
||||
if (min == max)
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
sb.append(" - ");
|
||||
sb.append(amountFormat.format(max));
|
||||
}
|
||||
|
||||
sb.append("</td></tr><tr><td width=48 align=right valign=top><font color=\"LEVEL\">Chance:</font></td>");
|
||||
sb.append("<td width=205 align=center>");
|
||||
sb.append(chanceFormat.format(Math.min(generalDropItem.getChance(npc, activeChar), 100)));
|
||||
sb.append("%</td></tr></table></td></tr><tr><td width=32></td><td width=259> </td></tr></table>");
|
||||
|
||||
height += 64;
|
||||
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(dropItem.getItemId());
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
// TODO: Premium herb amount? :)
|
||||
}
|
||||
else if (npc.isRaid())
|
||||
{
|
||||
// TODO: Premium raid amount? :)
|
||||
}
|
||||
else
|
||||
{
|
||||
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT;
|
||||
}
|
||||
|
||||
sb.append("</td></tr><tr><td width=32></td><td width=300> </td></tr></table>");
|
||||
}
|
||||
}
|
||||
|
||||
sb.append("<table width=332 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
|
||||
sb.append("<tr><td width=32 valign=top>");
|
||||
sb.append("<img src=\"" + (item.getIcon() == null ? "icon.etc_question_mark_i00" : item.getIcon()) + "\" width=32 height=32>");
|
||||
sb.append("</td><td fixwidth=300 align=center><font name=\"hs9\" color=\"CD9000\">");
|
||||
sb.append(item.getName());
|
||||
sb.append("</font></td></tr><tr><td width=32></td><td width=300><table width=295 cellpadding=0 cellspacing=0>");
|
||||
sb.append("<tr><td width=48 align=right valign=top><font color=\"LEVEL\">Amount:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
|
||||
final long min = (long) (dropItem.getMin() * rateAmount);
|
||||
final long max = (long) (dropItem.getMax() * rateAmount);
|
||||
if (min == max)
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(amountFormat.format(min));
|
||||
sb.append(" - ");
|
||||
sb.append(amountFormat.format(max));
|
||||
}
|
||||
|
||||
sb.append("</td></tr><tr><td width=48 align=right valign=top><font color=\"LEVEL\">Chance:</font></td>");
|
||||
sb.append("<td width=247 align=center>");
|
||||
sb.append(chanceFormat.format(Math.min((long) dropItem.getChance() * rateChance, 100)));
|
||||
sb.append("%</td></tr></table></td></tr><tr><td width=32></td><td width=300> </td></tr></table>");
|
||||
|
||||
if ((sb.length() + rightSb.length() + leftSb.length()) < 16000) // limit of 32766?
|
||||
{
|
||||
if (leftHeight >= (rightHeight + height))
|
||||
|
@ -22,23 +22,21 @@ import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.StringJoiner;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
import com.l2jmobius.commons.util.Rnd;
|
||||
import com.l2jmobius.gameserver.cache.HtmCache;
|
||||
import com.l2jmobius.gameserver.data.xml.impl.NpcData;
|
||||
import com.l2jmobius.gameserver.data.xml.impl.SpawnsData;
|
||||
import com.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import com.l2jmobius.gameserver.enums.DropType;
|
||||
import com.l2jmobius.gameserver.handler.CommunityBoardHandler;
|
||||
import com.l2jmobius.gameserver.handler.IParseBoardHandler;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.actor.templates.L2NpcTemplate;
|
||||
import com.l2jmobius.gameserver.model.drops.DropListScope;
|
||||
import com.l2jmobius.gameserver.model.drops.GeneralDropItem;
|
||||
import com.l2jmobius.gameserver.model.drops.GroupedGeneralDropItem;
|
||||
import com.l2jmobius.gameserver.model.drops.IDropItem;
|
||||
import com.l2jmobius.gameserver.model.holders.DropHolder;
|
||||
import com.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||
import com.l2jmobius.gameserver.model.items.L2Item;
|
||||
import com.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate;
|
||||
@ -56,40 +54,40 @@ public class DropSearchBoard implements IParseBoardHandler
|
||||
"_bbs_npc_trace"
|
||||
};
|
||||
|
||||
class DropHolder
|
||||
class CBDropHolder
|
||||
{
|
||||
int itemId;
|
||||
int npcId;
|
||||
byte npcLevel;
|
||||
long basemin;
|
||||
long basemax;
|
||||
double baseGroupChance;
|
||||
double basechance;
|
||||
boolean isSweep;
|
||||
long min;
|
||||
long max;
|
||||
double chance;
|
||||
boolean isSpoil;
|
||||
boolean isRaid;
|
||||
|
||||
public DropHolder(L2NpcTemplate npc, GeneralDropItem item, double groupChance, boolean isSweep)
|
||||
public CBDropHolder(L2NpcTemplate npcTemplate, DropHolder dropHolder)
|
||||
{
|
||||
itemId = item.getItemId();
|
||||
npcId = npc.getId();
|
||||
npcLevel = npc.getLevel();
|
||||
basemin = item.getMin();
|
||||
basemax = item.getMax();
|
||||
baseGroupChance = groupChance;
|
||||
basechance = item.getChance();
|
||||
this.isSweep = isSweep;
|
||||
isSpoil = dropHolder.getDropType() == DropType.SPOIL;
|
||||
itemId = dropHolder.getItemId();
|
||||
npcId = npcTemplate.getId();
|
||||
npcLevel = npcTemplate.getLevel();
|
||||
min = dropHolder.getMin();
|
||||
max = dropHolder.getMax();
|
||||
chance = dropHolder.getChance();
|
||||
isRaid = npcTemplate.getType().equals("L2RaidBoss") || npcTemplate.getType().equals("L2GrandBoss");
|
||||
}
|
||||
|
||||
/**
|
||||
* only for debug'/;
|
||||
* only for debug
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "DropHolder [itemId=" + itemId + ", npcId=" + npcId + ", npcLevel=" + npcLevel + ", basemin=" + basemin + ", basemax=" + basemax + ", baseGroupChance=" + baseGroupChance + ", basechance=" + basechance + ", isSweep=" + isSweep + "]";
|
||||
return "DropHolder [itemId=" + itemId + ", npcId=" + npcId + ", npcLevel=" + npcLevel + ", min=" + min + ", max=" + max + ", chance=" + chance + ", isSpoil=" + isSpoil + "]";
|
||||
}
|
||||
}
|
||||
|
||||
private final Map<Integer, List<DropHolder>> DROP_INDEX_CACHE = new HashMap<>();
|
||||
private final Map<Integer, List<CBDropHolder>> DROP_INDEX_CACHE = new HashMap<>();
|
||||
|
||||
// nonsupport items
|
||||
private final Set<Integer> BLOCK_ID = new HashSet<>();
|
||||
@ -104,44 +102,39 @@ public class DropSearchBoard implements IParseBoardHandler
|
||||
|
||||
private void buildDropIndex()
|
||||
{
|
||||
NpcData.getInstance().getTemplates(npc -> npc.getDropLists() != null).forEach(npcTemplate ->
|
||||
NpcData.getInstance().getTemplates(npc -> npc.getDropList(DropType.DROP) != null).forEach(npcTemplate ->
|
||||
{
|
||||
for (Entry<DropListScope, List<IDropItem>> entry : npcTemplate.getDropLists().entrySet())
|
||||
for (DropHolder dropHolder : npcTemplate.getDropList(DropType.DROP))
|
||||
{
|
||||
entry.getValue().forEach(idrop ->
|
||||
{
|
||||
if (idrop instanceof GroupedGeneralDropItem)
|
||||
{
|
||||
GroupedGeneralDropItem ggd = (GroupedGeneralDropItem) idrop;
|
||||
ggd.getItems().stream().forEach(gd -> addToDropList(npcTemplate, gd, ggd.getChance(), entry.getKey() == DropListScope.CORPSE));
|
||||
}
|
||||
else
|
||||
{
|
||||
GeneralDropItem gd = (GeneralDropItem) idrop;
|
||||
addToDropList(npcTemplate, gd, 100.0, entry.getKey() == DropListScope.CORPSE);
|
||||
}
|
||||
});
|
||||
addToDropList(npcTemplate, dropHolder);
|
||||
}
|
||||
});
|
||||
NpcData.getInstance().getTemplates(npc -> npc.getDropList(DropType.SPOIL) != null).forEach(npcTemplate ->
|
||||
{
|
||||
for (DropHolder dropHolder : npcTemplate.getDropList(DropType.SPOIL))
|
||||
{
|
||||
addToDropList(npcTemplate, dropHolder);
|
||||
}
|
||||
});
|
||||
|
||||
DROP_INDEX_CACHE.values().stream().forEach(l -> l.sort((d1, d2) -> Byte.valueOf(d1.npcLevel).compareTo(Byte.valueOf(d2.npcLevel))));
|
||||
}
|
||||
|
||||
private void addToDropList(L2NpcTemplate npcTemplate, GeneralDropItem gd, double groupChance, boolean isSweep)
|
||||
private void addToDropList(L2NpcTemplate npcTemplate, DropHolder dropHolder)
|
||||
{
|
||||
if (BLOCK_ID.contains(gd.getItemId()))
|
||||
if (BLOCK_ID.contains(dropHolder.getItemId()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
List<DropHolder> dropList = DROP_INDEX_CACHE.get(gd.getItemId());
|
||||
List<CBDropHolder> dropList = DROP_INDEX_CACHE.get(dropHolder.getItemId());
|
||||
if (dropList == null)
|
||||
{
|
||||
dropList = new ArrayList<>();
|
||||
DROP_INDEX_CACHE.put(gd.getItemId(), dropList);
|
||||
DROP_INDEX_CACHE.put(dropHolder.getItemId(), dropList);
|
||||
}
|
||||
|
||||
dropList.add(new DropHolder(npcTemplate, gd, groupChance, isSweep));
|
||||
dropList.add(new CBDropHolder(npcTemplate, dropHolder));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -164,7 +157,7 @@ public class DropSearchBoard implements IParseBoardHandler
|
||||
final DecimalFormat chanceFormat = new DecimalFormat("0.00##");
|
||||
int itemId = Integer.parseInt(params[1]);
|
||||
int page = Integer.parseInt(params[2]);
|
||||
List<DropHolder> list = DROP_INDEX_CACHE.get(itemId);
|
||||
List<CBDropHolder> list = DROP_INDEX_CACHE.get(itemId);
|
||||
int pages = list.size() / 14;
|
||||
if (pages == 0)
|
||||
{
|
||||
@ -176,13 +169,106 @@ public class DropSearchBoard implements IParseBoardHandler
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (int index = start; index <= end; index++)
|
||||
{
|
||||
DropHolder dropHolder = list.get(index);
|
||||
CBDropHolder cbDropHolder = list.get(index);
|
||||
|
||||
// real time server rate calculations
|
||||
double rateChance = 1;
|
||||
double rateAmount = 1;
|
||||
if (cbDropHolder.isSpoil)
|
||||
{
|
||||
rateChance = Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER;
|
||||
rateAmount = Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER;
|
||||
|
||||
// also check premium rates if available
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && player.hasPremiumStatus())
|
||||
{
|
||||
rateChance *= Config.PREMIUM_RATE_SPOIL_CHANCE;
|
||||
rateAmount *= Config.PREMIUM_RATE_SPOIL_AMOUNT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
final L2Item item = ItemTable.getInstance().getTemplate(cbDropHolder.itemId);
|
||||
|
||||
if (Config.RATE_DROP_CHANCE_BY_ID.get(cbDropHolder.itemId) != null)
|
||||
{
|
||||
rateChance *= Config.RATE_DROP_CHANCE_BY_ID.get(cbDropHolder.itemId);
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
rateChance *= Config.RATE_HERB_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else if (cbDropHolder.isRaid)
|
||||
{
|
||||
rateAmount *= Config.RATE_RAID_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
rateChance *= Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER;
|
||||
}
|
||||
|
||||
if (Config.RATE_DROP_AMOUNT_BY_ID.get(cbDropHolder.itemId) != null)
|
||||
{
|
||||
rateAmount *= Config.RATE_DROP_AMOUNT_BY_ID.get(cbDropHolder.itemId);
|
||||
}
|
||||
else if (cbDropHolder.isRaid)
|
||||
{
|
||||
rateAmount *= Config.RATE_RAID_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
rateAmount *= Config.RATE_HERB_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
else
|
||||
{
|
||||
rateAmount *= Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER;
|
||||
}
|
||||
|
||||
// also check premium rates if available
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED && player.hasPremiumStatus())
|
||||
{
|
||||
if (Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(cbDropHolder.itemId) != null)
|
||||
{
|
||||
rateChance *= Config.PREMIUM_RATE_DROP_CHANCE_BY_ID.get(cbDropHolder.itemId);
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
// TODO: Premium herb chance? :)
|
||||
}
|
||||
else if (cbDropHolder.isRaid)
|
||||
{
|
||||
// TODO: Premium raid chance? :)
|
||||
}
|
||||
else
|
||||
{
|
||||
rateChance *= Config.PREMIUM_RATE_DROP_CHANCE;
|
||||
}
|
||||
|
||||
if (Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(cbDropHolder.itemId) != null)
|
||||
{
|
||||
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT_BY_ID.get(cbDropHolder.itemId);
|
||||
}
|
||||
else if (item.hasExImmediateEffect())
|
||||
{
|
||||
// TODO: Premium herb amount? :)
|
||||
}
|
||||
else if (cbDropHolder.isRaid)
|
||||
{
|
||||
// TODO: Premium raid amount? :)
|
||||
}
|
||||
else
|
||||
{
|
||||
rateAmount *= Config.PREMIUM_RATE_DROP_AMOUNT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
builder.append("<tr>");
|
||||
builder.append("<td width=30>").append(dropHolder.npcLevel).append("</td>");
|
||||
builder.append("<td width=170>").append("<a action=\"bypass _bbs_npc_trace " + dropHolder.npcId + "\">").append("&@").append(dropHolder.npcId).append(";").append("</a>").append("</td>");
|
||||
builder.append("<td width=80 align=CENTER>").append(dropHolder.basemin).append("-").append(dropHolder.basemax).append("</td>");
|
||||
builder.append("<td width=50 align=CENTER>").append(chanceFormat.format((dropHolder.basechance * dropHolder.baseGroupChance) / 100)).append("%").append("</td>");
|
||||
builder.append("<td width=50 align=CENTER>").append(dropHolder.isSweep ? "Sweep" : "Drop").append("</td>");
|
||||
builder.append("<td width=30>").append(cbDropHolder.npcLevel).append("</td>");
|
||||
builder.append("<td width=170>").append("<a action=\"bypass _bbs_npc_trace " + cbDropHolder.npcId + "\">").append("&@").append(cbDropHolder.npcId).append(";").append("</a>").append("</td>");
|
||||
builder.append("<td width=80 align=CENTER>").append(cbDropHolder.min * rateAmount).append("-").append(cbDropHolder.max * rateAmount).append("</td>");
|
||||
builder.append("<td width=50 align=CENTER>").append(chanceFormat.format(cbDropHolder.chance * rateChance)).append("%").append("</td>");
|
||||
builder.append("<td width=50 align=CENTER>").append(cbDropHolder.isSpoil ? "Spoil" : "Drop").append("</td>");
|
||||
builder.append("</tr>");
|
||||
}
|
||||
|
||||
@ -204,7 +290,7 @@ public class DropSearchBoard implements IParseBoardHandler
|
||||
List<NpcSpawnTemplate> spawnList = SpawnsData.getInstance().getNpcSpawns(npc -> npc.getId() == npcId);
|
||||
if (spawnList.isEmpty())
|
||||
{
|
||||
player.sendMessage("cant find any spawn maybe boss or instance mob");
|
||||
player.sendMessage("Cannot find any spawn. Maybe dropped by a boss or instance monster.");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -49,15 +49,15 @@ public class Premium implements IVoicedCommandHandler
|
||||
html.append("<tr><td>Rate SP: <font color=\"LEVEL\"> x" + Config.RATE_SP + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Drop Chance: <font color=\"LEVEL\"> x" + Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER + "<br1></font></td></tr><br>");
|
||||
html.append("<tr><td>Drop Amount: <font color=\"LEVEL\"> x" + Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER + "<br1></font></td></tr><br>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\"> x" + Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER + "<br1></font></td></tr><br>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\"> x" + Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER + "<br><br></font></td></tr><br>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\"> x" + Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER + "<br1></font></td></tr><br>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\"> x" + Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER + "<br><br></font></td></tr><br>");
|
||||
html.append("<tr><td><center>Premium Info & Rules<br></td></tr>");
|
||||
html.append("<tr><td>Rate XP: <font color=\"LEVEL\"> x" + (Config.RATE_XP * Config.PREMIUM_RATE_XP) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Rate SP: <font color=\"LEVEL\"> x" + (Config.RATE_SP * Config.PREMIUM_RATE_SP) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Drop Chance: <font color=\"LEVEL\"> x" + (Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER * Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_DROP_CHANCE) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Drop Amount: <font color=\"LEVEL\"> x" + (Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_DROP_AMOUNT) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\"> x" + (Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_CHANCE) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\"> x" + (Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_AMOUNT) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\"> x" + (Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_CHANCE) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\"> x" + (Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_AMOUNT) + "<br1></font></td></tr>");
|
||||
html.append("<tr><td> <font color=\"70FFCA\">1. Premium benefits CAN NOT BE TRANSFERED.<br1></font></td></tr>");
|
||||
html.append("<tr><td> <font color=\"70FFCA\">2. Premium does not effect party members.<br1></font></td></tr>");
|
||||
html.append("<tr><td> <font color=\"70FFCA\">3. Premium benefits effect ALL characters in same account.</font></td></tr>");
|
||||
@ -71,8 +71,8 @@ public class Premium implements IVoicedCommandHandler
|
||||
html.append("<tr><td>Rate SP: <font color=\"LEVEL\">x" + (Config.RATE_SP * Config.PREMIUM_RATE_SP) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Drop Chance: <font color=\"LEVEL\">x" + (Config.RATE_DEATH_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_DROP_CHANCE) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Drop Amount: <font color=\"LEVEL\">x" + (Config.RATE_DEATH_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_DROP_AMOUNT) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\">x" + (Config.RATE_CORPSE_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_CHANCE) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\">x" + (Config.RATE_CORPSE_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_AMOUNT) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Chance: <font color=\"LEVEL\">x" + (Config.RATE_SPOIL_DROP_CHANCE_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_CHANCE) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Spoil Amount: <font color=\"LEVEL\">x" + (Config.RATE_SPOIL_DROP_AMOUNT_MULTIPLIER * Config.PREMIUM_RATE_SPOIL_AMOUNT) + " <br1></font></td></tr>");
|
||||
html.append("<tr><td>Expires: <font color=\"00A5FF\">" + format.format(endDate) + "</font></td></tr>");
|
||||
html.append("<tr><td>Current Date: <font color=\"70FFCA\">" + format.format(System.currentTimeMillis()) + "<br><br></font></td></tr>");
|
||||
html.append("<tr><td><center>Premium Info & Rules<br></center></td></tr>");
|
||||
|
@ -48,38 +48,26 @@
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="42">
|
||||
<item id="8600" min="1" max="1" chance="20" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="45" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="35" /> <!-- Superior Herb of Life -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8603" min="1" max="1" chance="10" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="54" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="36" /> <!-- Superior Herb of Mana -->
|
||||
</group>
|
||||
<group chance="25">
|
||||
<item id="8606" min="1" max="1" chance="20" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="20" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="20" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Power -->
|
||||
</group>
|
||||
<group chance="10">
|
||||
<item id="8607" min="1" max="1" chance="50" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="50" /> <!-- Herb of Casting Spd. -->
|
||||
</group>
|
||||
<group chance="1">
|
||||
<item id="8612" min="1" max="1" chance="33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="34" /> <!-- Herb of Recovery -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8611" min="1" max="1" chance="94" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="6" /> <!-- Mysterious Herb -->
|
||||
</group>
|
||||
</death>
|
||||
<drop>
|
||||
<item id="8600" min="1" max="1" chance="8.4" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="18.9" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="14.7" /> <!-- Superior Herb of Life -->
|
||||
<item id="8603" min="1" max="1" chance="1.1" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="5.94" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="3.96" /> <!-- Superior Herb of Mana -->
|
||||
<item id="8606" min="1" max="1" chance="5" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="5" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="5" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Power -->
|
||||
<item id="8607" min="1" max="1" chance="5" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="5" /> <!-- Herb of Casting Spd. -->
|
||||
<item id="8612" min="1" max="1" chance="0.33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="0.33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="0.34" /> <!-- Herb of Recovery -->
|
||||
<item id="8611" min="1" max="1" chance="10.34" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="0.66" /> <!-- Mysterious Herb -->
|
||||
</drop>
|
||||
</drop_lists>
|
||||
<status undying="false" />
|
||||
<collision>
|
||||
@ -138,38 +126,26 @@
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="42">
|
||||
<item id="8600" min="1" max="1" chance="20" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="45" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="35" /> <!-- Superior Herb of Life -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8603" min="1" max="1" chance="10" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="54" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="36" /> <!-- Superior Herb of Mana -->
|
||||
</group>
|
||||
<group chance="25">
|
||||
<item id="8606" min="1" max="1" chance="20" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="20" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="20" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Power -->
|
||||
</group>
|
||||
<group chance="10">
|
||||
<item id="8607" min="1" max="1" chance="50" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="50" /> <!-- Herb of Casting Spd. -->
|
||||
</group>
|
||||
<group chance="1">
|
||||
<item id="8612" min="1" max="1" chance="33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="34" /> <!-- Herb of Recovery -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8611" min="1" max="1" chance="94" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="6" /> <!-- Mysterious Herb -->
|
||||
</group>
|
||||
</death>
|
||||
<drop>
|
||||
<item id="8600" min="1" max="1" chance="8.4" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="18.9" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="14.7" /> <!-- Superior Herb of Life -->
|
||||
<item id="8603" min="1" max="1" chance="1.1" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="5.94" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="3.96" /> <!-- Superior Herb of Mana -->
|
||||
<item id="8606" min="1" max="1" chance="5" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="5" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="5" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Power -->
|
||||
<item id="8607" min="1" max="1" chance="5" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="5" /> <!-- Herb of Casting Spd. -->
|
||||
<item id="8612" min="1" max="1" chance="0.33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="0.33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="0.34" /> <!-- Herb of Recovery -->
|
||||
<item id="8611" min="1" max="1" chance="10.34" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="0.66" /> <!-- Mysterious Herb -->
|
||||
</drop>
|
||||
</drop_lists>
|
||||
<status undying="false" />
|
||||
<collision>
|
||||
@ -230,38 +206,26 @@
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="42">
|
||||
<item id="8600" min="1" max="1" chance="20" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="45" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="35" /> <!-- Superior Herb of Life -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8603" min="1" max="1" chance="10" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="54" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="36" /> <!-- Superior Herb of Mana -->
|
||||
</group>
|
||||
<group chance="25">
|
||||
<item id="8606" min="1" max="1" chance="20" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="20" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="20" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="20" /> <!-- Herb of Critical Attack - Power -->
|
||||
</group>
|
||||
<group chance="10">
|
||||
<item id="8607" min="1" max="1" chance="50" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="50" /> <!-- Herb of Casting Spd. -->
|
||||
</group>
|
||||
<group chance="1">
|
||||
<item id="8612" min="1" max="1" chance="33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="34" /> <!-- Herb of Recovery -->
|
||||
</group>
|
||||
<group chance="11">
|
||||
<item id="8611" min="1" max="1" chance="94" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="6" /> <!-- Mysterious Herb -->
|
||||
</group>
|
||||
</death>
|
||||
<drop>
|
||||
<item id="8600" min="1" max="1" chance="8.4" /> <!-- Herb of Life -->
|
||||
<item id="8601" min="1" max="1" chance="18.9" /> <!-- Major Herb of Life -->
|
||||
<item id="8602" min="1" max="1" chance="14.7" /> <!-- Superior Herb of Life -->
|
||||
<item id="8603" min="1" max="1" chance="1.1" /> <!-- Herb of Mana -->
|
||||
<item id="8604" min="1" max="1" chance="5.94" /> <!-- Major Herb of Mana -->
|
||||
<item id="8605" min="1" max="1" chance="3.96" /> <!-- Superior Herb of Mana -->
|
||||
<item id="8606" min="1" max="1" chance="5" /> <!-- Herb of Power -->
|
||||
<item id="8608" min="1" max="1" chance="5" /> <!-- Haste Herb -->
|
||||
<item id="8610" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Probability -->
|
||||
<item id="10655" min="1" max="1" chance="5" /> <!-- Herb of HP Drain -->
|
||||
<item id="10656" min="1" max="1" chance="5" /> <!-- Herb of Critical Attack - Power -->
|
||||
<item id="8607" min="1" max="1" chance="5" /> <!-- Herb of Magic -->
|
||||
<item id="8609" min="1" max="1" chance="5" /> <!-- Herb of Casting Spd. -->
|
||||
<item id="8612" min="1" max="1" chance="0.33" /> <!-- Herb of the Warrior -->
|
||||
<item id="8613" min="1" max="1" chance="0.33" /> <!-- Wizard Herb -->
|
||||
<item id="8614" min="1" max="1" chance="0.34" /> <!-- Herb of Recovery -->
|
||||
<item id="8611" min="1" max="1" chance="10.34" /> <!-- Wind Walk Herb -->
|
||||
<item id="10657" min="1" max="1" chance="0.66" /> <!-- Mysterious Herb -->
|
||||
</drop>
|
||||
</drop_lists>
|
||||
<status undying="false" />
|
||||
<collision>
|
||||
|
@ -2771,7 +2771,7 @@
|
||||
<height normal="68" />
|
||||
</collision>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<drop>
|
||||
<item id="17404" min="1" max="1" chance="1.074" /> <!-- Seraph Leather Leggings -->
|
||||
<item id="17398" min="1" max="1" chance="1.043" /> <!-- Seraph Gaiters -->
|
||||
<item id="17409" min="1" max="1" chance="0.974" /> <!-- Seraph Stockings -->
|
||||
@ -2821,7 +2821,7 @@
|
||||
<item id="35438" min="1" max="1" chance="0.3" /> <!-- Recipe: Seraph Leather Armor (60%) -->
|
||||
<item id="35439" min="1" max="1" chance="0.3" /> <!-- Recipe: Seraph Leather Leggings (60%) -->
|
||||
<item id="35430" min="1" max="1" chance="0.3" /> <!-- Recipe: Specter Retributer (60%) -->
|
||||
</death>
|
||||
</drop>
|
||||
</drop_lists>
|
||||
</npc>
|
||||
<npc id="3474" level="95" type="L2Monster" name="Super Kat the Cat" title="">
|
||||
@ -3003,7 +3003,7 @@
|
||||
<height normal="37.5" />
|
||||
</collision>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<drop>
|
||||
<item id="17308" min="1" max="1" chance="23.3" /> <!-- Immortal Boots -->
|
||||
<item id="17318" min="1" max="1" chance="22.9" /> <!-- Immortal Gloves -->
|
||||
<item id="17304" min="1" max="1" chance="16.58" /> <!-- Immortal Helmet -->
|
||||
@ -3016,7 +3016,7 @@
|
||||
<item id="17291" min="1" max="1" chance="1.482" /> <!-- Requiem Cutter -->
|
||||
<item id="17527" min="1" max="1" chance="46.38" /> <!-- Scroll: Enchant Armor (R-grade) -->
|
||||
<item id="17526" min="1" max="1" chance="3.604" /> <!-- Scroll: Enchant Weapon (R-grade) -->
|
||||
</death>
|
||||
</drop>
|
||||
</drop_lists>
|
||||
</npc>
|
||||
<npc id="3478" level="87" type="L2Monster" name="Reinforced Kat the Cat" title="">
|
||||
@ -3112,7 +3112,7 @@
|
||||
<height normal="37.5" />
|
||||
</collision>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<drop>
|
||||
<item id="17343" min="1" max="1" chance="66.6" /> <!-- Twilight Shield -->
|
||||
<item id="17339" min="1" max="1" chance="17.44" /> <!-- Twilight Breastplate -->
|
||||
<item id="17350" min="1" max="1" chance="16.67" /> <!-- Twilight Tunic -->
|
||||
@ -3120,7 +3120,7 @@
|
||||
<item id="17330" min="1" max="1" chance="0.75" /> <!-- Apocalypse Thrower -->
|
||||
<item id="17527" min="1" max="1" chance="46.65" /> <!-- Scroll: Enchant Armor (R-grade) -->
|
||||
<item id="17526" min="1" max="1" chance="3.631" /> <!-- Scroll: Enchant Weapon (R-grade) -->
|
||||
</death>
|
||||
</drop>
|
||||
</drop_lists>
|
||||
</npc>
|
||||
<npc id="3480" level="91" type="L2Monster" name="Mind-controlling Feline Queen" title="">
|
||||
@ -3216,13 +3216,13 @@
|
||||
<height normal="37.5" />
|
||||
</collision>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<drop>
|
||||
<item id="17352" min="1" max="1" chance="91.435" /> <!-- Twilight Gloves -->
|
||||
<item id="17347" min="1" max="1" chance="19.86" /> <!-- Twilight Leather Gloves -->
|
||||
<item id="17330" min="1" max="1" chance="7.489" /> <!-- Apocalypse Thrower -->
|
||||
<item id="17334" min="1" max="1" chance="1.587" /> <!-- Apocalypse Retributer -->
|
||||
<item id="17526" min="1" max="1" chance="35.82" /> <!-- Scroll: Enchant Weapon (R-grade) -->
|
||||
</death>
|
||||
</drop>
|
||||
</drop_lists>
|
||||
</npc>
|
||||
<npc id="3482" level="93" type="L2Monster" name="Traitorous Mew the Cat" title="">
|
||||
|
@ -63,19 +63,17 @@
|
||||
</clan_list>
|
||||
</ai>
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="8.082">
|
||||
<item id="2397" min="1" max="1" chance="0.37119524870082" /> <!-- Tunic of Zubei -->
|
||||
<item id="2402" min="1" max="1" chance="0.37119524870082" /> <!-- Stockings of Zubei -->
|
||||
<item id="2406" min="1" max="1" chance="0.37119524870082" /> <!-- Avadon Robe -->
|
||||
<item id="4070" min="1" max="1" chance="45.842613214551" /> <!-- Stockings of Zubei Fabric -->
|
||||
<item id="4069" min="1" max="1" chance="30.623608017817" /> <!-- Tunic of Zubei Fabric -->
|
||||
<item id="4071" min="1" max="1" chance="22.420193021529" /> <!-- Avadon Robe Fabric -->
|
||||
</group>
|
||||
</death>
|
||||
<lucky_corpse>
|
||||
<drop>
|
||||
<item id="2397" min="1" max="1" chance="0.0300000000000003" /> <!-- Tunic of Zubei -->
|
||||
<item id="2402" min="1" max="1" chance="0.0300000000000003" /> <!-- Stockings of Zubei -->
|
||||
<item id="2406" min="1" max="1" chance="0.0300000000000003" /> <!-- Avadon Robe -->
|
||||
<item id="4070" min="1" max="1" chance="3.70500000000001" /> <!-- Stockings of Zubei Fabric -->
|
||||
<item id="4069" min="1" max="1" chance="2.47499999999997" /> <!-- Tunic of Zubei Fabric -->
|
||||
<item id="4071" min="1" max="1" chance="1.81199999999997" /> <!-- Avadon Robe Fabric -->
|
||||
</drop>
|
||||
<lucky_drop>
|
||||
<item id="39629" min="1" max="1" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
|
||||
</lucky_corpse>
|
||||
</lucky_drop>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="14" />
|
||||
|
@ -2175,20 +2175,16 @@
|
||||
<s_npc_prop_hp_rate>0.25</s_npc_prop_hp_rate>
|
||||
<ai type="BALANCED" aggroRange="300" clanHelpRange="300" isAggressive="true" />
|
||||
<drop_lists>
|
||||
<death>
|
||||
<group chance="70">
|
||||
<item id="57" min="711" max="1659" chance="100" /> <!-- Adena -->
|
||||
</group>
|
||||
<group chance="17.71">
|
||||
<item id="8787" min="1" max="1" chance="100" /> <!-- Sprigant's Fruit -->
|
||||
</group>
|
||||
</death>
|
||||
<corpse>
|
||||
<drop>
|
||||
<item id="57" min="711" max="1659" chance="70" /> <!-- Adena -->
|
||||
<item id="8787" min="1" max="1" chance="17.71" /> <!-- Sprigant's Fruit -->
|
||||
</drop>
|
||||
<spoil>
|
||||
<item id="36532" min="1" max="1" chance="0.75" /> <!-- Thin Braid -->
|
||||
<item id="36533" min="1" max="1" chance="0.3" /> <!-- Synthetic Braid -->
|
||||
<item id="36882" min="1" max="1" chance="0.03" /> <!-- Recipe: Thin Braid - Upgrade -->
|
||||
<item id="36881" min="1" max="1" chance="0.003" /> <!-- Recipe: Thin Braid - Downgrade -->
|
||||
</corpse>
|
||||
</spoil>
|
||||
</drop_lists>
|
||||
<collision>
|
||||
<radius normal="45" />
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user