diff options
Diffstat (limited to 'src/main')
-rwxr-xr-x | src/main/java/kr/syeyoung/dungeonsguide/dungeon/MapProcessor.java | 34 | ||||
-rwxr-xr-x | src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/RoomMatcher.java | 17 |
2 files changed, 46 insertions, 5 deletions
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/MapProcessor.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/MapProcessor.java index 665d8a7f..0852ef79 100755 --- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/MapProcessor.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/MapProcessor.java @@ -224,6 +224,7 @@ public class MapProcessor { 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)); + if (rooms == null) continue; e.sendDebugChat(new ChatComponentText("New Map discovered! shape: "+rooms.getShape()+ " color: "+rooms.getColor()+" unitPos: "+x+","+y)); e.sendDebugChat(new ChatComponentText("New Map discovered! mapMin: "+rooms.getMin())); StringBuilder builder = new StringBuilder(); @@ -286,7 +287,12 @@ public class MapProcessor { Point pt2 = roomPointToMapPoint(ayConnected.get(0)); byte unit1 = MapUtils.getMapColorAt(mapData, pt2.x, pt2.y); - return new DungeonRoom(ayConnected, shape, unit1, roomPointToWorldPoint(new Point(minX, minY)), roomPointToWorldPoint(new Point(maxX+1, maxY+1)).add(-1, 0, -1), context); + try{ + return new DungeonRoom(ayConnected, shape, unit1, roomPointToWorldPoint(new Point(minX, minY)), roomPointToWorldPoint(new Point(maxX+1, maxY+1)).add(-1, 0, -1), context); + } catch (IllegalStateException ex) { + e.sendDebugChat(new ChatComponentText("Failed to load room, retrying later :: "+ex.getLocalizedMessage())); + return null; + } } private boolean checkIfConnected(byte[] mapData, Point unitPoint1, Point unitPoint2) { @@ -309,6 +315,14 @@ public class MapProcessor { return unit1 == unit2 && unit2 == unit3 && unit1 != 0; } + public boolean isThereDifference(byte[] colors1, byte[] colors) { + if (colors1 == null || colors == null) return true; + for (int i =0; i < colors.length; i++) + if (colors[i] != colors1[i]) return true; + return false; + } + private int stabilizationTick = 0; + public void tick() { if (waitCnt < 5) { waitCnt++; @@ -325,11 +339,22 @@ public class MapProcessor { else { mapData = mapData1.colors; lastMapData2 = mapData1; + + if (isThereDifference(lastMapData, mapData)) { + stabilizationTick =0; + } else { + stabilizationTick++; + } + + if (stabilizationTick > 5) { + if (doorDimension == null) buildMap(mapData); + else processMap(mapData); + } + lastMapData = mapData; } + } - if (lastMapData == null && mapData != null) buildMap(mapData); - else if (mapData != null) processMap(mapData); if (lastMapData2 != null && mapIconToPlayerMap.size() < context.getPlayers().size()) { label: for (Map.Entry<String, Vec4b> stringVec4bEntry : lastMapData2.mapDecorations.entrySet()) { @@ -341,7 +366,7 @@ public class MapProcessor { for (String player : context.getPlayers()) { // check nearby players if (mapIconToPlayerMap.containsKey(player)) continue; EntityPlayer entityPlayer = Minecraft.getMinecraft().theWorld.getPlayerEntityByName(player); - if (entityPlayer == null) continue; + if (entityPlayer == null || entityPlayer.isInvisible()) continue; BlockPos pos = entityPlayer.getPosition(); int dx = mapPos.getX() - pos.getX(); int dz = mapPos.getZ() - pos.getZ(); @@ -367,6 +392,5 @@ public class MapProcessor { } } - lastMapData = mapData; } } diff --git a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/RoomMatcher.java b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/RoomMatcher.java index 43675f61..41967e6c 100755 --- a/src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/RoomMatcher.java +++ b/src/main/java/kr/syeyoung/dungeonsguide/dungeon/roomfinder/RoomMatcher.java @@ -5,6 +5,8 @@ import kr.syeyoung.dungeonsguide.utils.ArrayUtils; import kr.syeyoung.dungeonsguide.utils.ShortUtils; import lombok.Getter; import net.minecraft.block.Block; +import net.minecraft.util.BlockPos; +import net.minecraft.world.World; import java.util.List; @@ -17,12 +19,26 @@ public class RoomMatcher { private int rotation; // how much the "found room" has to rotate to match the given dungeon room info. ! private boolean triedMatch = false; + private World w; + public RoomMatcher(DungeonRoom dungeonRoom) { this.dungeonRoom = dungeonRoom; + w = dungeonRoom.getContext().getWorld(); } public DungeonRoomInfo match() { if (triedMatch) return match; + + int zz = dungeonRoom.getMax().getZ() - dungeonRoom.getMin().getZ() + 1; + int xx = dungeonRoom.getMax().getX() - dungeonRoom.getMin().getX() + 1; + for (int z = 0; z < zz; z ++) { + for (int x = 0; x < xx; x++) { + if (x % 8 == 0 && z % 8 == 0 && dungeonRoom.getContext().getWorld().getChunkFromBlockCoords(dungeonRoom.getRelativeBlockPosAt(x, 0, z)).isEmpty()) { + throw new IllegalStateException("chunk is not loaded"); + } + } + } + triedMatch = true; for (int rotation = 0; rotation < 4; rotation++) { short shape = dungeonRoom.getShape(); @@ -54,6 +70,7 @@ public class RoomMatcher { int data = res[z][x]; if (data == -1) continue; Block b = dungeonRoom.getRelativeBlockAt(x,0,z); + if (b == null || Block.getIdFromBlock(b) != data) { return false; } |