aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/kr/syeyoung/dungeonsguide/dungeon
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/kr/syeyoung/dungeonsguide/dungeon')
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/dungeon/DungeonContext.java13
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/dungeon/MapProcessor.java47
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/dungeon/data/DungeonRoomInfo.java1
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java (renamed from src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDoorFinder.java)8
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DoorFinderRegistry.java20
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProvider.java (renamed from src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/StartDoorFinder.java)6
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProviderRegistry.java20
-rwxr-xr-xsrc/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/DungeonRoom.java15
8 files changed, 90 insertions, 40 deletions
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/DungeonContext.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/DungeonContext.java
index 59ce37c6..7a6d704f 100755
--- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/DungeonContext.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/DungeonContext.java
@@ -5,12 +5,11 @@ import kr.syeyoung.dungeonsguide.roomprocessor.RoomProcessor;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.util.BlockPos;
+import net.minecraft.util.IntegerCache;
import net.minecraft.world.World;
import java.awt.*;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -32,6 +31,14 @@ public class DungeonContext {
@Getter
private List<RoomProcessor> globalRoomProcessors = new ArrayList<RoomProcessor>();
+ @Getter
+ private Map<String, Integer> deaths = new HashMap<String, Integer>();
+ @Getter
+ private List<String[]> milestoneReached = new ArrayList<String[]>();
+ @Getter
+ @Setter
+ private int BossRoomEnterSeconds;
+
public DungeonContext(World world) {
this.world = world;
mapProcessor = new MapProcessor(this);
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/MapProcessor.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/MapProcessor.java
index 698b78ab..0bf0d9e5 100755
--- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/MapProcessor.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/MapProcessor.java
@@ -4,9 +4,10 @@ import com.google.common.collect.Sets;
import kr.syeyoung.dungeonsguide.e;
import kr.syeyoung.dungeonsguide.SkyblockStatus;
import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoom;
-import kr.syeyoung.dungeonsguide.dungeon.doorfinder.DoorFinderRegistry;
-import kr.syeyoung.dungeonsguide.dungeon.doorfinder.StartDoorFinder;
+import kr.syeyoung.dungeonsguide.dungeon.doorfinder.DungeonSpecificDataProviderRegistry;
+import kr.syeyoung.dungeonsguide.dungeon.doorfinder.DungeonSpecificDataProvider;
import kr.syeyoung.dungeonsguide.utils.MapUtils;
+import lombok.Getter;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemMap;
import net.minecraft.item.ItemStack;
@@ -35,12 +36,21 @@ public class MapProcessor {
private boolean axisMatch = false;
+ @Getter
+ private int undiscoveredRoom = 0;
+
public MapProcessor(DungeonContext context) {
this.context = context;
}
private static final Set<Vector2d> directions = Sets.newHashSet(new Vector2d(0,1), new Vector2d(0, -1), new Vector2d(1, 0), new Vector2d(-1 , 0));
+ public boolean isInBossRoom() {
+ Point roomPt = worldPointToRoomPoint(Minecraft.getMinecraft().thePlayer.getPosition());
+ Point mapPt = roomPointToMapPoint(roomPt);
+ return mapPt.x < 0 || mapPt.y < 0 || mapPt.x > 128 || mapPt.y > 128;
+ }
+
private int waitCnt = 0;
private void buildMap(final byte[] mapData) {
final Point startroom = MapUtils.findFirstColorWithIn(mapData, (byte) 30, new Rectangle(0,0,128,128));
@@ -98,13 +108,13 @@ public class MapProcessor {
}
// determine door location based on npc, and determine map min from there
{
- StartDoorFinder doorFinder = DoorFinderRegistry.getDoorFinder(((SkyblockStatus) e.getDungeonsGuide().getSkyblockStatus()).getDungeonName());
+ DungeonSpecificDataProvider doorFinder = DungeonSpecificDataProviderRegistry.getDoorFinder(((SkyblockStatus) e.getDungeonsGuide().getSkyblockStatus()).getDungeonName());
if (doorFinder == null) {
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cCouldn't find door processor for "+e.getDungeonsGuide().getSkyblockStatus().getDungeonName()));
bugged = true;
return;
}
- BlockPos door = doorFinder.find(context.getWorld());
+ BlockPos door = doorFinder.findDoor(context.getWorld(), e.getDungeonsGuide().getSkyblockStatus().getDungeonName());
if (door == null) {
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§eDungeons Guide §7:: §cCouldn't determine door of the room, disabling mod for this dungeon run"));
bugged = true;
@@ -117,7 +127,7 @@ public class MapProcessor {
unitPoint.translate(unitPoint.x + 1, unitPoint.y + 1);
unitPoint.translate((int)doorDir.x, (int)doorDir.y);
- Vector2d offset = doorFinder.offset(context.getWorld());
+ Vector2d offset = doorFinder.findDoorOffset(context.getWorld(), e.getDungeonsGuide().getSkyblockStatus().getDungeonName());
axisMatch = doorDir.equals(offset);
int worldX = unitPoint.x * 16;
@@ -155,14 +165,34 @@ public class MapProcessor {
private void processMap(byte[] mapData) {
int height = (int)((128.0 - topLeftMapPoint.y) / (unitRoomDimension.height + doorDimension.height));
int width = (int) ((128.0 - topLeftMapPoint.x) / (unitRoomDimension.width + doorDimension.height));
+ undiscoveredRoom = 0;
if (MapUtils.getMapColorAt(mapData,0,0) != 0) return;
for (int y = 0; y <= height; y++){
for (int x = 0; x <= width; x++) {
- if (roomsFound.contains(new Point(x,y))) continue;
-
Point mapPoint = roomPointToMapPoint(new Point(x,y));
byte color = MapUtils.getMapColorAt(mapData, mapPoint.x, mapPoint.y);
MapUtils.record(mapData, mapPoint.x, mapPoint.y, new Color(255,255,0,80));
+ if (roomsFound.contains(new Point(x,y))) {
+ DungeonRoom dungeonRoom = context.getRoomMapper().get(new Point(x,y));
+ if (color == 30 || color == 18) {
+ dungeonRoom.setCurrentState(DungeonRoom.RoomState.FINISHED);
+ } else {
+ byte centerColor = MapUtils.getMapColorAt(mapData, mapPoint.x + unitRoomDimension.width / 2, mapPoint.y + unitRoomDimension.height / 2);
+ MapUtils.record(mapData, mapPoint.x + unitRoomDimension.width / 2, mapPoint.y + unitRoomDimension.height / 2, new Color(0,255,0,80));
+ if (centerColor == 34) {
+ dungeonRoom.setCurrentState(DungeonRoom.RoomState.COMPLETE_WITHOUT_SECRETS);
+ } else if (centerColor == 30) {
+ dungeonRoom.setCurrentState(DungeonRoom.RoomState.FINISHED);
+ } else if (centerColor == 18) { // red
+ dungeonRoom.setCurrentState(DungeonRoom.RoomState.FAILED);
+ }
+ }
+ if (dungeonRoom.getTotalSecrets() == -1) {
+ MapUtils.record(mapData, mapPoint.x, mapPoint.y +1, new Color(0,255,0,80));
+ }
+ continue;
+ }
+
if (color != 0 && color != 85) {
MapUtils.record(mapData, mapPoint.x, mapPoint.y, new Color(0,255,255,80));
DungeonRoom rooms = buildRoom(mapData, new Point(x,y));
@@ -185,11 +215,12 @@ public class MapProcessor {
}
if (rooms.getRoomProcessor() != null && rooms.getRoomProcessor().readGlobalChat())
context.getGlobalRoomProcessors().add(rooms.getRoomProcessor());
+ } else if (color == 85){
+ undiscoveredRoom++;
}
}
}
-
}
private DungeonRoom buildRoom(byte[] mapData, Point unitPoint) {
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/data/DungeonRoomInfo.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/data/DungeonRoomInfo.java
index 05cd57d6..71b51255 100755
--- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/data/DungeonRoomInfo.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/data/DungeonRoomInfo.java
@@ -38,4 +38,5 @@ public class DungeonRoomInfo implements Serializable {
private Map<String, Object> properties = new HashMap<String, Object>();
private Map<String, DungeonMechanic> mechanics = new HashMap<String, DungeonMechanic>();
+ private int totalSecrets = -1;
}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDoorFinder.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java
index b73fa2aa..7f4e9813 100755
--- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDoorFinder.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/CatacombDataProvider.java
@@ -2,23 +2,21 @@ package kr.syeyoung.dungeonsguide.dungeon.doorfinder;
import com.google.common.base.Predicate;
import com.google.common.collect.Sets;
-import net.minecraft.client.Minecraft;
import net.minecraft.entity.item.EntityArmorStand;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
-import net.minecraft.util.ChatComponentText;
import net.minecraft.world.World;
import javax.vecmath.Vector2d;
import java.util.Collection;
import java.util.Set;
-public class CatacombDoorFinder implements StartDoorFinder {
+public class CatacombDataProvider implements DungeonSpecificDataProvider {
private static final Set<Vector2d> directions = Sets.newHashSet(new Vector2d(0,1), new Vector2d(0, -1), new Vector2d(1, 0), new Vector2d(-1 , 0));
@Override
- public BlockPos find(World w) {
+ public BlockPos findDoor(World w, String dungeonName) {
Collection<EntityArmorStand> armorStand = w.getEntities(EntityArmorStand.class, new Predicate<EntityArmorStand>() {
@Override
public boolean apply(EntityArmorStand input) {
@@ -43,7 +41,7 @@ public class CatacombDoorFinder implements StartDoorFinder {
}
@Override
- public Vector2d offset(World w) {
+ public Vector2d findDoorOffset(World w, String dungeonName) {
Collection<EntityArmorStand> armorStand = w.getEntities(EntityArmorStand.class, new Predicate<EntityArmorStand>() {
@Override
public boolean apply(EntityArmorStand input) {
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DoorFinderRegistry.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DoorFinderRegistry.java
deleted file mode 100755
index 0fb3c89a..00000000
--- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DoorFinderRegistry.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package kr.syeyoung.dungeonsguide.dungeon.doorfinder;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-public class DoorFinderRegistry {
- private static final Map<Pattern, StartDoorFinder> doorFinders = new HashMap<Pattern, StartDoorFinder>();
-
- static {
- doorFinders.put(Pattern.compile("The Catacombs (?:F[0-9]|E)"), new CatacombDoorFinder());
- }
-
- public static StartDoorFinder getDoorFinder(String dungeonName) {
- for (Map.Entry<Pattern, StartDoorFinder> doorFinderEntry :doorFinders.entrySet()){
- if (doorFinderEntry.getKey().matcher(dungeonName).matches()) return doorFinderEntry.getValue();
- }
- return null;
- }
-}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/StartDoorFinder.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProvider.java
index ee1ccdaa..cc97d73a 100755
--- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/StartDoorFinder.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProvider.java
@@ -5,7 +5,7 @@ import net.minecraft.world.World;
import javax.vecmath.Vector2d;
-public interface StartDoorFinder {
- BlockPos find(World w);
- Vector2d offset(World w);
+public interface DungeonSpecificDataProvider {
+ BlockPos findDoor(World w, String dungeonName);
+ Vector2d findDoorOffset(World w, String dungeonName);
}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProviderRegistry.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProviderRegistry.java
new file mode 100755
index 00000000..41048bd2
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/doorfinder/DungeonSpecificDataProviderRegistry.java
@@ -0,0 +1,20 @@
+package kr.syeyoung.dungeonsguide.dungeon.doorfinder;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+public class DungeonSpecificDataProviderRegistry {
+ private static final Map<Pattern, DungeonSpecificDataProvider> doorFinders = new HashMap<Pattern, DungeonSpecificDataProvider>();
+
+ static {
+ doorFinders.put(Pattern.compile("The Catacombs (?:F[0-9]|E)"), new CatacombDataProvider());
+ }
+
+ public static DungeonSpecificDataProvider getDoorFinder(String dungeonName) {
+ for (Map.Entry<Pattern, DungeonSpecificDataProvider> doorFinderEntry :doorFinders.entrySet()){
+ if (doorFinderEntry.getKey().matcher(dungeonName).matches()) return doorFinderEntry.getValue();
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/DungeonRoom.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/DungeonRoom.java
index c6afb59f..6b0322ee 100755
--- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/DungeonRoom.java
+++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/DungeonRoom.java
@@ -8,7 +8,9 @@ import kr.syeyoung.dungeonsguide.dungeon.doorfinder.DungeonDoor;
import kr.syeyoung.dungeonsguide.roomprocessor.ProcessorFactory;
import kr.syeyoung.dungeonsguide.roomprocessor.RoomProcessor;
import kr.syeyoung.dungeonsguide.roomprocessor.RoomProcessorGenerator;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.Setter;
import net.minecraft.block.Block;
import net.minecraft.util.BlockPos;
@@ -36,6 +38,17 @@ public class DungeonRoom {
private final int unitWidth; // X
private final int unitHeight; // Z
+ @Setter
+ private int totalSecrets = -1;
+ @Setter
+ private RoomState currentState = RoomState.DISCOVERED;
+
+ @AllArgsConstructor
+ @Getter
+ public static enum RoomState {
+ DISCOVERED(0), COMPLETE_WITHOUT_SECRETS(0), FINISHED(0), FAILED(-14);
+ private int scoreModifier;
+ }
private RoomProcessor roomProcessor;
@@ -55,7 +68,6 @@ public class DungeonRoom {
unitWidth = (int) Math.ceil(max.getX() - min.getX() / 32.0);
unitHeight = (int) Math.ceil(max.getZ() - min.getZ() / 32.0);
-
buildDoors();
buildRoom();
updateRoomProcessor();
@@ -88,6 +100,7 @@ public class DungeonRoom {
dungeonRoomInfo = roomMatcher.createNew();
this.dungeonRoomInfo = dungeonRoomInfo;
+ totalSecrets = dungeonRoomInfo.getTotalSecrets();
}
public void updateRoomProcessor() {