Rename and clean up MaplePlayerNPCPositioner

This commit is contained in:
P0nk
2021-09-09 22:02:56 +02:00
parent 8b6a2e58f8
commit 0ca463f70a
2 changed files with 73 additions and 73 deletions

View File

@@ -30,8 +30,8 @@ import constants.game.GameConstants;
import net.server.Server; import net.server.Server;
import net.server.channel.Channel; import net.server.channel.Channel;
import net.server.world.World; import net.server.world.World;
import server.life.positioner.MaplePlayerNPCPositioner;
import server.life.positioner.PlayerNPCPodium; import server.life.positioner.PlayerNPCPodium;
import server.life.positioner.PlayerNPCPositioner;
import server.maps.AbstractMapleMapObject; import server.maps.AbstractMapleMapObject;
import server.maps.MapleMap; import server.maps.MapleMap;
import server.maps.MapleMapObject; import server.maps.MapleMapObject;
@@ -391,7 +391,7 @@ public class MaplePlayerNPC extends AbstractMapleMapObject {
if (GameConstants.isPodiumHallOfFameMap(map.getId())) { if (GameConstants.isPodiumHallOfFameMap(map.getId())) {
pos = PlayerNPCPodium.getNextPlayerNpcPosition(map); pos = PlayerNPCPodium.getNextPlayerNpcPosition(map);
} else { } else {
pos = MaplePlayerNPCPositioner.getNextPlayerNpcPosition(map); pos = PlayerNPCPositioner.getNextPlayerNpcPosition(map);
} }
if (pos == null) { if (pos == null) {

View File

@@ -35,53 +35,51 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
/** /**
*
* @author RonanLana * @author RonanLana
*
*/ */
public class MaplePlayerNPCPositioner { public class PlayerNPCPositioner {
private static boolean isPlayerNpcNearby(List<Point> otherPos, Point searchPos, int xLimit, int yLimit) { private static boolean isPlayerNpcNearby(List<Point> otherPos, Point searchPos, int xLimit, int yLimit) {
int xLimit2 = xLimit / 2, yLimit2 = yLimit / 2; int xLimit2 = xLimit / 2, yLimit2 = yLimit / 2;
Rectangle searchRect = new Rectangle(searchPos.x - xLimit2, searchPos.y - yLimit2, xLimit, yLimit); 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); Rectangle otherRect = new Rectangle(pos.x - xLimit2, pos.y - yLimit2, xLimit, yLimit);
if(otherRect.intersects(searchRect)) { if (otherRect.intersects(searchRect)) {
return true; return true;
} }
} }
return false; return false;
} }
private static int calcDx(int newStep) { private static int calcDx(int newStep) {
return YamlConfig.config.server.PLAYERNPC_AREA_X / (newStep + 1); return YamlConfig.config.server.PLAYERNPC_AREA_X / (newStep + 1);
} }
private static int calcDy(int newStep) { private static int calcDy(int newStep) {
return (YamlConfig.config.server.PLAYERNPC_AREA_Y / 2) + (YamlConfig.config.server.PLAYERNPC_AREA_Y / (1 << (newStep + 1))); return (YamlConfig.config.server.PLAYERNPC_AREA_Y / 2) + (YamlConfig.config.server.PLAYERNPC_AREA_Y / (1 << (newStep + 1)));
} }
private static List<Point> rearrangePlayerNpcPositions(MapleMap map, int newStep, int pnpcsSize) { private static List<Point> rearrangePlayerNpcPositions(MapleMap map, int newStep, int pnpcsSize) {
Rectangle mapArea = map.getMapArea(); 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 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 outx = mapArea.x + mapArea.width - YamlConfig.config.server.PLAYERNPC_INITIAL_X, outy = mapArea.y + mapArea.height;
int cx = calcDx(newStep), cy = calcDy(newStep); int cx = calcDx(newStep), cy = calcDy(newStep);
List<Point> otherPlayerNpcs = new LinkedList<>(); List<Point> otherPlayerNpcs = new LinkedList<>();
while(py < outy) { while (py < outy) {
px = leftPx; px = leftPx;
while(px < outx) { while (px < outx) {
Point searchPos = map.getPointBelow(new Point(px, py)); Point searchPos = map.getPointBelow(new Point(px, py));
if(searchPos != null) { if (searchPos != null) {
if(!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) { if (!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) {
otherPlayerNpcs.add(searchPos); otherPlayerNpcs.add(searchPos);
if(otherPlayerNpcs.size() == pnpcsSize) { if (otherPlayerNpcs.size() == pnpcsSize) {
return otherPlayerNpcs; return otherPlayerNpcs;
} }
} }
@@ -92,34 +90,34 @@ public class MaplePlayerNPCPositioner {
py += cy; py += cy;
} }
return null; return null;
} }
private static Point rearrangePlayerNpcs(MapleMap map, int newStep, List<MaplePlayerNPC> pnpcs) { private static Point rearrangePlayerNpcs(MapleMap map, int newStep, List<MaplePlayerNPC> pnpcs) {
Rectangle mapArea = map.getMapArea(); 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 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 outx = mapArea.x + mapArea.width - YamlConfig.config.server.PLAYERNPC_INITIAL_X, outy = mapArea.y + mapArea.height;
int cx = calcDx(newStep), cy = calcDy(newStep); int cx = calcDx(newStep), cy = calcDy(newStep);
List<Point> otherPlayerNpcs = new LinkedList<>(); List<Point> otherPlayerNpcs = new LinkedList<>();
int i = 0; int i = 0;
while(py < outy) { while (py < outy) {
px = leftPx; px = leftPx;
while(px < outx) { while (px < outx) {
Point searchPos = map.getPointBelow(new Point(px, py)); Point searchPos = map.getPointBelow(new Point(px, py));
if(searchPos != null) { if (searchPos != null) {
if(!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) { if (!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) {
if(i == pnpcs.size()) { if (i == pnpcs.size()) {
return searchPos; return searchPos;
} }
MaplePlayerNPC pn = pnpcs.get(i); MaplePlayerNPC pn = pnpcs.get(i);
i++; i++;
pn.updatePlayerNPCPosition(map, searchPos); pn.updatePlayerNPCPosition(map, searchPos);
otherPlayerNpcs.add(searchPos); otherPlayerNpcs.add(searchPos);
} }
@@ -130,108 +128,110 @@ public class MaplePlayerNPCPositioner {
py += cy; py += cy;
} }
return null; // this area should not be reached under any scenario return null; // this area should not be reached under any scenario
} }
private static Point reorganizePlayerNpcs(MapleMap map, int newStep, List<MapleMapObject> mmoList) { private static Point reorganizePlayerNpcs(MapleMap map, int newStep, List<MapleMapObject> mmoList) {
if(!mmoList.isEmpty()) { if (!mmoList.isEmpty()) {
if(YamlConfig.config.server.USE_DEBUG) System.out.println("Reorganizing pnpc map, step " + newStep); if (YamlConfig.config.server.USE_DEBUG) {
System.out.println("Reorganizing pnpc map, step " + newStep);
}
List<MaplePlayerNPC> playerNpcs = new ArrayList<>(mmoList.size()); List<MaplePlayerNPC> playerNpcs = new ArrayList<>(mmoList.size());
for(MapleMapObject mmo : mmoList) { for (MapleMapObject mmo : mmoList) {
playerNpcs.add((MaplePlayerNPC) mmo); playerNpcs.add((MaplePlayerNPC) mmo);
} }
playerNpcs.sort((p1, p2) -> { playerNpcs.sort((p1, p2) -> {
return p1.getScriptId() - p2.getScriptId(); // scriptid as playernpc history 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()); MapleMap m = ch.getMapFactory().getMap(map.getId());
for(MaplePlayerNPC pn : playerNpcs) { for (MaplePlayerNPC pn : playerNpcs) {
m.removeMapObject(pn); m.removeMapObject(pn);
m.broadcastMessage(PacketCreator.removeNPCController(pn.getObjectId())); m.broadcastMessage(PacketCreator.removeNPCController(pn.getObjectId()));
m.broadcastMessage(PacketCreator.removePlayerNPC(pn.getObjectId())); m.broadcastMessage(PacketCreator.removePlayerNPC(pn.getObjectId()));
} }
} }
Point ret = rearrangePlayerNpcs(map, newStep, playerNpcs); 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()); MapleMap m = ch.getMapFactory().getMap(map.getId());
for(MaplePlayerNPC pn : playerNpcs) { for (MaplePlayerNPC pn : playerNpcs) {
m.addPlayerNPCMapObject(pn); m.addPlayerNPCMapObject(pn);
m.broadcastMessage(PacketCreator.spawnPlayerNPC(pn)); m.broadcastMessage(PacketCreator.spawnPlayerNPC(pn));
m.broadcastMessage(PacketCreator.getPlayerNPC(pn)); m.broadcastMessage(PacketCreator.getPlayerNPC(pn));
} }
} }
return ret; return ret;
} }
return null; return null;
} }
private static Point getNextPlayerNpcPosition(MapleMap map, int initStep) { // automated playernpc position thanks to Ronan private static Point getNextPlayerNpcPosition(MapleMap map, int initStep) { // automated playernpc position thanks to Ronan
List<MapleMapObject> mmoList = map.getMapObjectsInRange(new Point(0, 0), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.PLAYER_NPC)); List<MapleMapObject> mmoList = map.getMapObjectsInRange(new Point(0, 0), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.PLAYER_NPC));
List<Point> otherPlayerNpcs = new LinkedList<>(); List<Point> otherPlayerNpcs = new LinkedList<>();
for(MapleMapObject mmo : mmoList) { for (MapleMapObject mmo : mmoList) {
otherPlayerNpcs.add(mmo.getPosition()); otherPlayerNpcs.add(mmo.getPosition());
} }
int cx = calcDx(initStep), cy = calcDy(initStep); int cx = calcDx(initStep), cy = calcDy(initStep);
Rectangle mapArea = map.getMapArea(); Rectangle mapArea = map.getMapArea();
int outx = mapArea.x + mapArea.width - YamlConfig.config.server.PLAYERNPC_INITIAL_X, outy = mapArea.y + mapArea.height; int outx = mapArea.x + mapArea.width - YamlConfig.config.server.PLAYERNPC_INITIAL_X, outy = mapArea.y + mapArea.height;
boolean reorganize = false; boolean reorganize = false;
int i = initStep; 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; 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; px = leftPx;
while(px < outx) { while (px < outx) {
Point searchPos = map.getPointBelow(new Point(px, py)); Point searchPos = map.getPointBelow(new Point(px, py));
if(searchPos != null) { if (searchPos != null) {
if(!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) { if (!isPlayerNpcNearby(otherPlayerNpcs, searchPos, cx, cy)) {
if(i > initStep) { if (i > initStep) {
map.getWorldServer().setPlayerNpcMapStep(map.getId(), i); 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 reorganizePlayerNpcs(map, i, mmoList);
} }
return searchPos; return searchPos;
} }
} }
px += cx; px += cx;
} }
py += cy; py += cy;
} }
reorganize = true; reorganize = true;
i++; i++;
cx = calcDx(i); cx = calcDx(i);
cy = calcDy(i); cy = calcDy(i);
if(YamlConfig.config.server.PLAYERNPC_ORGANIZE_AREA) { if (YamlConfig.config.server.PLAYERNPC_ORGANIZE_AREA) {
otherPlayerNpcs = rearrangePlayerNpcPositions(map, i, mmoList.size()); otherPlayerNpcs = rearrangePlayerNpcPositions(map, i, mmoList.size());
} }
} }
if(i > initStep) { if (i > initStep) {
map.getWorldServer().setPlayerNpcMapStep(map.getId(), YamlConfig.config.server.PLAYERNPC_AREA_STEPS - 1); map.getWorldServer().setPlayerNpcMapStep(map.getId(), YamlConfig.config.server.PLAYERNPC_AREA_STEPS - 1);
} }
return null; return null;
} }
public static Point getNextPlayerNpcPosition(MapleMap map) { public static Point getNextPlayerNpcPosition(MapleMap map) {
return getNextPlayerNpcPosition(map, map.getWorldServer().getPlayerNpcMapStep(map.getId())); return getNextPlayerNpcPosition(map, map.getWorldServer().getPlayerNpcMapStep(map.getId()));
} }