Selaa lähdekoodia

Merge branch 'drop2'

DP part of L2J/L2J_Server@37b4f3164c119f14ae2e2756a313fd0d4181e264
Battlecruiser 10 vuotta sitten
vanhempi
sitoutus
01a06da5c2

+ 72 - 60
L2J_DataPack/dist/game/data/scripts/handlers/bypasshandlers/NpcViewMod.java

@@ -290,34 +290,7 @@ public class NpcViewMod implements IBypassHandler
 			final IDropItem dropItem = dropList.get(i);
 			if (dropItem instanceof GeneralDropItem)
 			{
-				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>");
-				
-				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=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>&nbsp;</td></tr></table>");
+				addGeneralDropItem(activeChar, npc, amountFormat, chanceFormat, sb, (GeneralDropItem) dropItem);
 			}
 			else if (dropItem instanceof GroupedGeneralDropItem)
 			{
@@ -325,46 +298,21 @@ public class NpcViewMod implements IBypassHandler
 				if (generalGroupedDropItem.getItems().size() == 1)
 				{
 					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)
-					{
-						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(generalGroupedDropItem.getChance(npc, activeChar), 100)));
-					sb.append("%</td></tr></table></td></tr><tr><td width=32></td><td width=300>&nbsp;</td></tr></table>");
+					addGeneralDropItem(activeChar, npc, amountFormat, chanceFormat, sb, new GeneralDropItem(generalDropItem.getItemId(), generalDropItem.getMin(), generalDropItem.getMax(), (generalDropItem.getChance() * generalGroupedDropItem.getChance()) / 100, generalDropItem.getAmountStrategy(), generalDropItem.getChanceStrategy(), generalGroupedDropItem.getPreciseStrategy(), generalGroupedDropItem.getKillerChanceModifierStrategy(), generalDropItem.getDropCalculationStrategy()));
 				}
 				else
 				{
+					GroupedGeneralDropItem normalized = generalGroupedDropItem.normalizeMe(npc, activeChar);
 					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(chanceFormat.format(Math.min(normalized.getChance(), 100)));
 					sb.append("%</td></tr></table><br>");
 					
-					for (GeneralDropItem generalDropItem : generalGroupedDropItem.getItems())
+					for (GeneralDropItem generalDropItem : normalized.getItems())
 					{
 						final L2Item item = ItemTable.getInstance().getTemplate(generalDropItem.getItemId());
 						sb.append("<table width=291 cellpadding=2 cellspacing=0 background=\"L2UI_CT1.Windows.Windows_DF_TooltipBG\">");
@@ -374,9 +322,9 @@ public class NpcViewMod implements IBypassHandler
 						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);
+						MinMax minMax = getPreciseMinMax(normalized.getChance(), generalDropItem.getMin(npc), generalDropItem.getMax(npc), generalDropItem.isPreciseCalculated());
+						final long min = minMax.min;
+						final long max = minMax.max;
 						if (min == max)
 						{
 							sb.append(amountFormat.format(min));
@@ -433,4 +381,68 @@ public class NpcViewMod implements IBypassHandler
 		html = html.replaceAll("%items%", bodySb.toString());
 		Util.sendCBHtml(activeChar, html);
 	}
+	
+	/**
+	 * @param activeChar
+	 * @param npc
+	 * @param amountFormat
+	 * @param chanceFormat
+	 * @param sb
+	 * @param dropItem
+	 */
+	private static void addGeneralDropItem(L2PcInstance activeChar, L2Npc npc, final DecimalFormat amountFormat, final DecimalFormat chanceFormat, final StringBuilder sb, final GeneralDropItem dropItem)
+	{
+		final L2Item item = ItemTable.getInstance().getTemplate(dropItem.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>");
+		MinMax minMax = getPreciseMinMax(dropItem.getChance(npc, activeChar), dropItem.getMin(npc), dropItem.getMax(npc), dropItem.isPreciseCalculated());
+		
+		final long min = minMax.min;
+		final long max = minMax.max;
+		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(dropItem.getChance(npc, activeChar), 100)));
+		sb.append("%</td></tr></table></td></tr><tr><td width=32></td><td width=300>&nbsp;</td></tr></table>");
+	}
+	
+	private static class MinMax
+	{
+		public final long min, max;
+		
+		public MinMax(long min, long max)
+		{
+			this.min = min;
+			this.max = max;
+			
+		}
+		
+	}
+	
+	private static MinMax getPreciseMinMax(double chance, long min, long max, boolean isPrecise)
+	{
+		if (!isPrecise || (chance <= 100))
+		{
+			return new MinMax(min, max);
+		}
+		
+		int mult = (int) (chance) / 100;
+		return new MinMax(mult * min, (chance % 100) > 0 ? (mult + 1) * max : mult * max);
+	}
 }