diff --git a/src/main/java/server/life/MaplePlayerNPC.java b/src/main/java/server/life/MaplePlayerNPC.java index f493f26118..ae9976b53f 100644 --- a/src/main/java/server/life/MaplePlayerNPC.java +++ b/src/main/java/server/life/MaplePlayerNPC.java @@ -30,8 +30,8 @@ import constants.game.GameConstants; import net.server.Server; import net.server.channel.Channel; import net.server.world.World; -import server.life.positioner.MaplePlayerNPCPositioner; import server.life.positioner.PlayerNPCPodium; +import server.life.positioner.PlayerNPCPositioner; import server.maps.AbstractMapleMapObject; import server.maps.MapleMap; import server.maps.MapleMapObject; @@ -391,7 +391,7 @@ public class MaplePlayerNPC extends AbstractMapleMapObject { if (GameConstants.isPodiumHallOfFameMap(map.getId())) { pos = PlayerNPCPodium.getNextPlayerNpcPosition(map); } else { - pos = MaplePlayerNPCPositioner.getNextPlayerNpcPosition(map); + pos = PlayerNPCPositioner.getNextPlayerNpcPosition(map); } if (pos == null) { diff --git a/src/main/java/server/life/positioner/MaplePlayerNPCPositioner.java b/src/main/java/server/life/positioner/PlayerNPCPositioner.java similarity index 77% rename from src/main/java/server/life/positioner/MaplePlayerNPCPositioner.java rename to src/main/java/server/life/positioner/PlayerNPCPositioner.java index 5b153f671e..b39986ce2e 100644 --- a/src/main/java/server/life/positioner/MaplePlayerNPCPositioner.java +++ b/src/main/java/server/life/positioner/PlayerNPCPositioner.java @@ -35,53 +35,51 @@ import java.util.LinkedList; import java.util.List; /** - * * @author RonanLana - * */ -public class MaplePlayerNPCPositioner { - +public class PlayerNPCPositioner { + private static boolean isPlayerNpcNearby(List otherPos, Point searchPos, int xLimit, int yLimit) { int xLimit2 = xLimit / 2, yLimit2 = yLimit / 2; - + Rectangle searchRect = new Rectangle(searchPos.x - xLimit2, searchPos.y - yLimit2, xLimit, yLimit); - for(Point pos : otherPos) { + for (Point pos : otherPos) { Rectangle otherRect = new Rectangle(pos.x - xLimit2, pos.y - yLimit2, xLimit, yLimit); - - if(otherRect.intersects(searchRect)) { + + if (otherRect.intersects(searchRect)) { return true; } } - + return false; } - + private static int calcDx(int newStep) { return YamlConfig.config.server.PLAYERNPC_AREA_X / (newStep + 1); } - + private static int calcDy(int newStep) { return (YamlConfig.config.server.PLAYERNPC_AREA_Y / 2) + (YamlConfig.config.server.PLAYERNPC_AREA_Y / (1 << (newStep + 1))); } - + private static List rearrangePlayerNpcPositions(MapleMap map, int newStep, int pnpcsSize) { Rectangle mapArea = map.getMapArea(); - + int leftPx = mapArea.x + YamlConfig.config.server.PLAYERNPC_INITIAL_X, px, py = mapArea.y + YamlConfig.config.server.PLAYERNPC_INITIAL_Y; int outx = mapArea.x + mapArea.width - YamlConfig.config.server.PLAYERNPC_INITIAL_X, outy = mapArea.y + mapArea.height; int cx = calcDx(newStep), cy = calcDy(newStep); - + List otherPlayerNpcs = new LinkedList<>(); - while(py < outy) { + while (py < outy) { px = leftPx; - while(px < outx) { + while (px < outx) { Point searchPos = map.getPointBelow(new Point(px, py)); - if(searchPos != null) { - if(!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) { + if (searchPos != null) { + if (!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) { otherPlayerNpcs.add(searchPos); - - if(otherPlayerNpcs.size() == pnpcsSize) { + + if (otherPlayerNpcs.size() == pnpcsSize) { return otherPlayerNpcs; } } @@ -92,34 +90,34 @@ public class MaplePlayerNPCPositioner { py += cy; } - + return null; } - + private static Point rearrangePlayerNpcs(MapleMap map, int newStep, List pnpcs) { Rectangle mapArea = map.getMapArea(); - + int leftPx = mapArea.x + YamlConfig.config.server.PLAYERNPC_INITIAL_X, px, py = mapArea.y + YamlConfig.config.server.PLAYERNPC_INITIAL_Y; int outx = mapArea.x + mapArea.width - YamlConfig.config.server.PLAYERNPC_INITIAL_X, outy = mapArea.y + mapArea.height; int cx = calcDx(newStep), cy = calcDy(newStep); - + List otherPlayerNpcs = new LinkedList<>(); int i = 0; - - while(py < outy) { + + while (py < outy) { px = leftPx; - while(px < outx) { + while (px < outx) { Point searchPos = map.getPointBelow(new Point(px, py)); - if(searchPos != null) { - if(!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) { - if(i == pnpcs.size()) { + if (searchPos != null) { + if (!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) { + if (i == pnpcs.size()) { return searchPos; } - + MaplePlayerNPC pn = pnpcs.get(i); i++; - + pn.updatePlayerNPCPosition(map, searchPos); otherPlayerNpcs.add(searchPos); } @@ -130,108 +128,110 @@ public class MaplePlayerNPCPositioner { py += cy; } - + return null; // this area should not be reached under any scenario } - + private static Point reorganizePlayerNpcs(MapleMap map, int newStep, List mmoList) { - if(!mmoList.isEmpty()) { - if(YamlConfig.config.server.USE_DEBUG) System.out.println("Reorganizing pnpc map, step " + newStep); - + if (!mmoList.isEmpty()) { + if (YamlConfig.config.server.USE_DEBUG) { + System.out.println("Reorganizing pnpc map, step " + newStep); + } + List playerNpcs = new ArrayList<>(mmoList.size()); - for(MapleMapObject mmo : mmoList) { + for (MapleMapObject mmo : mmoList) { playerNpcs.add((MaplePlayerNPC) mmo); } - + playerNpcs.sort((p1, p2) -> { return p1.getScriptId() - p2.getScriptId(); // scriptid as playernpc history }); - - for(Channel ch : Server.getInstance().getChannelsFromWorld(map.getWorld())) { + + for (Channel ch : Server.getInstance().getChannelsFromWorld(map.getWorld())) { MapleMap m = ch.getMapFactory().getMap(map.getId()); - - for(MaplePlayerNPC pn : playerNpcs) { + + for (MaplePlayerNPC pn : playerNpcs) { m.removeMapObject(pn); m.broadcastMessage(PacketCreator.removeNPCController(pn.getObjectId())); m.broadcastMessage(PacketCreator.removePlayerNPC(pn.getObjectId())); } } - + Point ret = rearrangePlayerNpcs(map, newStep, playerNpcs); - - for(Channel ch : Server.getInstance().getChannelsFromWorld(map.getWorld())) { + + for (Channel ch : Server.getInstance().getChannelsFromWorld(map.getWorld())) { MapleMap m = ch.getMapFactory().getMap(map.getId()); - - for(MaplePlayerNPC pn : playerNpcs) { + + for (MaplePlayerNPC pn : playerNpcs) { m.addPlayerNPCMapObject(pn); m.broadcastMessage(PacketCreator.spawnPlayerNPC(pn)); m.broadcastMessage(PacketCreator.getPlayerNPC(pn)); } } - + return ret; } - + return null; } - + private static Point getNextPlayerNpcPosition(MapleMap map, int initStep) { // automated playernpc position thanks to Ronan List mmoList = map.getMapObjectsInRange(new Point(0, 0), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.PLAYER_NPC)); List otherPlayerNpcs = new LinkedList<>(); - for(MapleMapObject mmo : mmoList) { + for (MapleMapObject mmo : mmoList) { otherPlayerNpcs.add(mmo.getPosition()); } - + int cx = calcDx(initStep), cy = calcDy(initStep); Rectangle mapArea = map.getMapArea(); int outx = mapArea.x + mapArea.width - YamlConfig.config.server.PLAYERNPC_INITIAL_X, outy = mapArea.y + mapArea.height; boolean reorganize = false; - + int i = initStep; - while(i < YamlConfig.config.server.PLAYERNPC_AREA_STEPS) { + while (i < YamlConfig.config.server.PLAYERNPC_AREA_STEPS) { int leftPx = mapArea.x + YamlConfig.config.server.PLAYERNPC_INITIAL_X, px, py = mapArea.y + YamlConfig.config.server.PLAYERNPC_INITIAL_Y; - - while(py < outy) { + + while (py < outy) { px = leftPx; - - while(px < outx) { + + while (px < outx) { Point searchPos = map.getPointBelow(new Point(px, py)); - if(searchPos != null) { - if(!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) { - if(i > initStep) { + if (searchPos != null) { + if (!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) { + if (i > initStep) { map.getWorldServer().setPlayerNpcMapStep(map.getId(), i); } - if(reorganize && YamlConfig.config.server.PLAYERNPC_ORGANIZE_AREA) { + if (reorganize && YamlConfig.config.server.PLAYERNPC_ORGANIZE_AREA) { return reorganizePlayerNpcs(map, i, mmoList); } return searchPos; } } - + px += cx; } - + py += cy; } - + reorganize = true; i++; - + cx = calcDx(i); cy = calcDy(i); - if(YamlConfig.config.server.PLAYERNPC_ORGANIZE_AREA) { + if (YamlConfig.config.server.PLAYERNPC_ORGANIZE_AREA) { otherPlayerNpcs = rearrangePlayerNpcPositions(map, i, mmoList.size()); } } - - if(i > initStep) { + + if (i > initStep) { map.getWorldServer().setPlayerNpcMapStep(map.getId(), YamlConfig.config.server.PLAYERNPC_AREA_STEPS - 1); } return null; } - + public static Point getNextPlayerNpcPosition(MapleMap map) { return getNextPlayerNpcPosition(map, map.getWorldServer().getPlayerNpcMapStep(map.getId())); }