diff --git a/src/main/java/server/maps/MapleMap.java b/src/main/java/server/maps/MapleMap.java index ceadc01aff1..2766be48c0c 100644 --- a/src/main/java/server/maps/MapleMap.java +++ b/src/main/java/server/maps/MapleMap.java @@ -668,14 +668,14 @@ private byte dropItemsFromMonsterOnMap(List dropEntry, Point p float cardRate = chr.getCardRate(de.itemId); int dropChance = (int) Math.min((float) de.chance * chRate * cardRate, Integer.MAX_VALUE); - if (Randomizer.nextInt(999999) < dropChance) { + if (Randomizer.nextInt(1000000) < dropChance) { if (droptype == 3) { pos.x = mobpos + ((d % 2 == 0) ? (40 * ((d + 1) / 2)) : -(40 * (d / 2))); } else { pos.x = mobpos + ((d % 2 == 0) ? (25 * ((d + 1) / 2)) : -(25 * (d / 2))); } if (de.itemId == 0) { // meso - int mesos = Randomizer.nextInt(de.Maximum - de.Minimum) + de.Minimum; + int mesos = Randomizer.nextInt(de.Maximum - de.Minimum + 1) + de.Minimum; if (mesos > 0) { if (chr.getBuffedValue(BuffStat.MESOUP) != null) { @@ -692,7 +692,7 @@ private byte dropItemsFromMonsterOnMap(List dropEntry, Point p if (ItemConstants.getInventoryType(de.itemId) == InventoryType.EQUIP) { idrop = ii.randomizeStats((Equip) ii.getEquipById(de.itemId)); } else { - idrop = new Item(de.itemId, (short) 0, (short) (de.Maximum != 1 ? Randomizer.nextInt(de.Maximum - de.Minimum) + de.Minimum : 1)); + idrop = new Item(de.itemId, (short) 0, (short) (Randomizer.nextInt(de.Maximum - de.Minimum + 1) + de.Minimum)); } spawnDrop(idrop, calcDropPos(pos, mob.getPosition()), mob, chr, droptype, de.questid); } @@ -710,7 +710,7 @@ private byte dropGlobalItemsFromMonsterOnMap(List global ItemInformationProvider ii = ItemInformationProvider.getInstance(); for (final MonsterGlobalDropEntry de : globalEntry) { - if (Randomizer.nextInt(999999) < de.chance) { + if (Randomizer.nextInt(1000000) < de.chance) { if (droptype == 3) { pos.x = mobpos + (d % 2 == 0 ? (40 * (d + 1) / 2) : -(40 * (d / 2))); } else { @@ -720,7 +720,7 @@ private byte dropGlobalItemsFromMonsterOnMap(List global if (ItemConstants.getInventoryType(de.itemId) == InventoryType.EQUIP) { idrop = ii.randomizeStats((Equip) ii.getEquipById(de.itemId)); } else { - idrop = new Item(de.itemId, (short) 0, (short) (de.Maximum != 1 ? Randomizer.nextInt(de.Maximum - de.Minimum) + de.Minimum : 1)); + idrop = new Item(de.itemId, (short) 0, (short) (Randomizer.nextInt(de.Maximum - de.Minimum + 1) + de.Minimum)); } spawnDrop(idrop, calcDropPos(pos, mob.getPosition()), mob, chr, droptype, de.questid); d++; diff --git a/src/test/java/tools/NextIntTest.java b/src/test/java/tools/NextIntTest.java new file mode 100644 index 00000000000..628184e6414 --- /dev/null +++ b/src/test/java/tools/NextIntTest.java @@ -0,0 +1,33 @@ +package tools; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class NextIntTest { + + @Test + void dropQuantityShouldIncludeEntireRange() { + Map rands; + final int rounds = 100_000; + for (int min = 1; min < 100; min++) { + for (int max = min; max < 100; max++) { + rands = new HashMap<>(); + for (int i = 0; i < rounds; i++) { + int randomValue = Randomizer.nextInt(max - min + 1) + min; + rands.compute(randomValue, (k, v) -> v == null ? 0 : v + 1); + } + + assertFalse(rands.containsKey(min - 1)); + for (int i = min; i <= max; i++) { + assertTrue(rands.containsKey(i)); + } + assertFalse(rands.containsKey(max + 1)); + } + } + } +}