From 02aa4a237fd8b160d8328f08cdd12215af3ca985 Mon Sep 17 00:00:00 2001 From: P0nk Date: Thu, 16 Mar 2023 18:00:21 +0100 Subject: [PATCH] Global monster drops are retrieved from DropProvider (postgres db) --- src/main/java/database/drop/DropProvider.java | 9 ++++++- .../life/MonsterInformationProvider.java | 2 -- src/main/java/server/maps/MapleMap.java | 3 +-- .../java/database/drop/DropProviderTest.java | 27 +++++++++++++++++-- .../database/maker/MakerInfoProviderTest.java | 8 +++--- src/test/java/service/NoteServiceTest.java | 8 +++--- .../testutil/{AnyValues.java => Any.java} | 2 +- 7 files changed, 43 insertions(+), 16 deletions(-) rename src/test/java/testutil/{AnyValues.java => Any.java} (92%) diff --git a/src/main/java/database/drop/DropProvider.java b/src/main/java/database/drop/DropProvider.java index c43e383c98..adb3e08c54 100644 --- a/src/main/java/database/drop/DropProvider.java +++ b/src/main/java/database/drop/DropProvider.java @@ -38,7 +38,14 @@ public class DropProvider { monsterDrop.maxQuantity(), questId); } - public List getGlobalDropEntries() { + public List getRelevantGlobalDrops(int mapId) { + int continentId = mapId / 100_000_000; + return getGlobalDropEntries().stream() + .filter(drop -> drop.continentid < 0 || drop.continentid == continentId) + .toList(); + } + + private List getGlobalDropEntries() { if (this.globalMonsterDrops == null) { loadGlobalDrops(); } diff --git a/src/main/java/server/life/MonsterInformationProvider.java b/src/main/java/server/life/MonsterInformationProvider.java index a81876a01d..446f53d724 100644 --- a/src/main/java/server/life/MonsterInformationProvider.java +++ b/src/main/java/server/life/MonsterInformationProvider.java @@ -46,7 +46,6 @@ public class MonsterInformationProvider { return instance; } - private final Map> drops = new HashMap<>(); private final List globaldrops = new ArrayList<>(); private final Map> continentdrops = new HashMap<>(); @@ -179,7 +178,6 @@ public class MonsterInformationProvider { } public final void clearDrops() { - drops.clear(); globaldrops.clear(); continentdrops.clear(); retrieveGlobal(); diff --git a/src/main/java/server/maps/MapleMap.java b/src/main/java/server/maps/MapleMap.java index 044651e58b..487803226d 100644 --- a/src/main/java/server/maps/MapleMap.java +++ b/src/main/java/server/maps/MapleMap.java @@ -729,8 +729,7 @@ public class MapleMap { chRate = 1; } - final MonsterInformationProvider mi = MonsterInformationProvider.getInstance(); - final List globalEntry = mi.getRelevantGlobalDrops(this.getId()); + final List globalEntry = dropProvider.getRelevantGlobalDrops(this.getId()); final List dropEntry = new ArrayList<>(); final List visibleQuestEntry = new ArrayList<>(); diff --git a/src/test/java/database/drop/DropProviderTest.java b/src/test/java/database/drop/DropProviderTest.java index 04e9fa6630..d8b3d180aa 100644 --- a/src/test/java/database/drop/DropProviderTest.java +++ b/src/test/java/database/drop/DropProviderTest.java @@ -6,6 +6,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import server.life.MonsterDropEntry; import server.life.MonsterGlobalDropEntry; +import testutil.Any; import java.util.Collections; import java.util.List; @@ -82,8 +83,8 @@ class DropProviderTest { GlobalMonsterDrop globalDrop = new GlobalMonsterDrop(2049100, -1, 2, 3, null, 450); when(dropDao.getGlobalMonsterDrops()).thenReturn(List.of(globalDrop)); - List dropEntries1 = dropProvider.getGlobalDropEntries(); - List dropEntries2 = dropProvider.getGlobalDropEntries(); + List dropEntries1 = dropProvider.getRelevantGlobalDrops(Any.integer()); + List dropEntries2 = dropProvider.getRelevantGlobalDrops(Any.integer()); assertEquals(1, dropEntries1.size()); assertEquals(1, dropEntries2.size()); @@ -104,6 +105,28 @@ class DropProviderTest { verify(dropDao, times(1)).getGlobalMonsterDrops(); } + @Test + void getRelevantGlobalDrop() { + GlobalMonsterDrop ossyriaDrop = new GlobalMonsterDrop(Any.integer(), 2, Any.integer(), Any.integer(), Any.integer(), Any.integer()); + when(dropDao.getGlobalMonsterDrops()).thenReturn(List.of(ossyriaDrop)); + int ossyriaMapId = 200_000_200; + + List dropEntries = dropProvider.getRelevantGlobalDrops(ossyriaMapId); + + assertEquals(1, dropEntries.size()); + } + + @Test + void getRelevantGlobalDrop_wrongContinent() { + GlobalMonsterDrop ellinDrop = new GlobalMonsterDrop(Any.integer(), 3, Any.integer(), Any.integer(), Any.integer(), Any.integer()); + when(dropDao.getGlobalMonsterDrops()).thenReturn(List.of(ellinDrop)); + int victoriaMapId = 102_000_000; + + List dropEntries = dropProvider.getRelevantGlobalDrops(victoriaMapId); + + assertTrue(dropEntries.isEmpty()); + } + // TODO: add tests for getRandomStealDrop() once ItemInformationProvider is able to be mocked. // Currently, it does database calls (and a bunch of other stuff) in the constructor, which is problematic. } diff --git a/src/test/java/database/maker/MakerInfoProviderTest.java b/src/test/java/database/maker/MakerInfoProviderTest.java index 9fbc1ad723..d7d5e807f3 100644 --- a/src/test/java/database/maker/MakerInfoProviderTest.java +++ b/src/test/java/database/maker/MakerInfoProviderTest.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import server.MakerItemFactory; -import testutil.AnyValues; +import testutil.Any; import tools.Pair; import java.util.List; @@ -80,7 +80,7 @@ class MakerInfoProviderTest { void getRecipeFromDb_notFound() { givenNoRecipe(); - Optional recipe = makerInfoProvider.getMakerRecipe(AnyValues.integer()); + Optional recipe = makerInfoProvider.getMakerRecipe(Any.integer()); assertTrue(recipe.isEmpty()); } @@ -111,7 +111,7 @@ class MakerInfoProviderTest { MakerRecipe recipeWithCatalyst = new MakerRecipe(0, (short) 0, (short) 0, (short) 0, 0, null, null, catalyst, (short) 0, (short) 0); when(makerDao.getRecipe(anyInt())).thenReturn(Optional.of(recipeWithCatalyst)); - Optional stimulant = makerInfoProvider.getStimulant(AnyValues.integer()); + Optional stimulant = makerInfoProvider.getStimulant(Any.integer()); assertTrue(stimulant.isPresent()); assertEquals(catalyst, stimulant.get()); @@ -121,7 +121,7 @@ class MakerInfoProviderTest { void getStimulant_noRecipe() { givenNoRecipe(); - Optional stimulant = makerInfoProvider.getStimulant(AnyValues.integer()); + Optional stimulant = makerInfoProvider.getStimulant(Any.integer()); assertTrue(stimulant.isEmpty()); } diff --git a/src/test/java/service/NoteServiceTest.java b/src/test/java/service/NoteServiceTest.java index f23de1ae84..756650a39d 100644 --- a/src/test/java/service/NoteServiceTest.java +++ b/src/test/java/service/NoteServiceTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import testutil.Any; import testutil.Mocks; import java.util.Collections; @@ -17,8 +18,7 @@ import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; -import static testutil.AnyValues.daoException; -import static testutil.AnyValues.string; +import static testutil.Any.daoException; class NoteServiceTest { @@ -73,7 +73,7 @@ class NoteServiceTest { void sendFailure() { doThrow(daoException()).when(noteDao).save(any()); - boolean success = noteService.sendNormal(string(), string(), string()); + boolean success = noteService.sendNormal(Any.string(), Any.string(), Any.string()); assertFalse(success); verify(noteDao).save(any()); @@ -139,4 +139,4 @@ class NoteServiceTest { assertTrue(deletedNote.isEmpty()); } -} \ No newline at end of file +} diff --git a/src/test/java/testutil/AnyValues.java b/src/test/java/testutil/Any.java similarity index 92% rename from src/test/java/testutil/AnyValues.java rename to src/test/java/testutil/Any.java index 509f379b50..4f07d46a66 100644 --- a/src/test/java/testutil/AnyValues.java +++ b/src/test/java/testutil/Any.java @@ -2,7 +2,7 @@ package testutil; import database.DaoException; -public class AnyValues { +public class Any { public static String string() { return "string";