/* * Copyright (C) 2004-2014 L2J Server * * This file is part of L2J Server. * * L2J Server is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * L2J Server is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.l2jserver.gameserver.util; import java.awt.Color; import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.geoengine.Direction; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.network.serverpackets.ExServerPrimitive; /** * @author FBIagent */ public final class GeoUtils { public static void debug2DLine(L2PcInstance player, int x, int y, int tx, int ty, int z) { int gx = GeoData.getInstance().getGeoX(x); int gy = GeoData.getInstance().getGeoY(y); int tgx = GeoData.getInstance().getGeoX(tx); int tgy = GeoData.getInstance().getGeoY(ty); ExServerPrimitive prim = new ExServerPrimitive("Debug2DLine", x, y, z); prim.addLine(Color.BLUE, GeoData.getInstance().getWorldX(gx), GeoData.getInstance().getWorldY(gy), z, GeoData.getInstance().getWorldX(tgx), GeoData.getInstance().getWorldY(tgy), z); LinePointIterator iter = new LinePointIterator(gx, gy, tgx, tgy); while (iter.next()) { int wx = GeoData.getInstance().getWorldX(iter.x()); int wy = GeoData.getInstance().getWorldY(iter.y()); prim.addPoint(Color.RED, wx, wy, z); } player.sendPacket(prim); } public static void debug3DLine(L2PcInstance player, int x, int y, int z, int tx, int ty, int tz) { int gx = GeoData.getInstance().getGeoX(x); int gy = GeoData.getInstance().getGeoY(y); int tgx = GeoData.getInstance().getGeoX(tx); int tgy = GeoData.getInstance().getGeoY(ty); ExServerPrimitive prim = new ExServerPrimitive("Debug3DLine", x, y, z); prim.addLine(Color.BLUE, GeoData.getInstance().getWorldX(gx), GeoData.getInstance().getWorldY(gy), z, GeoData.getInstance().getWorldX(tgx), GeoData.getInstance().getWorldY(tgy), tz); LinePointIterator3D iter = new LinePointIterator3D(gx, gy, z, tgx, tgy, tz); iter.next(); int prevX = iter.x(); int prevY = iter.y(); int wx = GeoData.getInstance().getWorldX(prevX); int wy = GeoData.getInstance().getWorldY(prevY); int wz = iter.z(); prim.addPoint(Color.RED, wx, wy, wz); while (iter.next()) { int curX = iter.x(); int curY = iter.y(); if ((curX != prevX) || (curY != prevY)) { wx = GeoData.getInstance().getWorldX(curX); wy = GeoData.getInstance().getWorldY(curY); wz = iter.z(); prim.addPoint(Color.RED, wx, wy, wz); prevX = curX; prevY = curY; } } player.sendPacket(prim); } /** * difference between x values: never abover 1
* difference between y values: never above 1 * @param lastX * @param lastY * @param x * @param y * @return */ public static Direction computeDirection(int lastX, int lastY, int x, int y) { if (x > lastX) // east { if (y > lastY) { return Direction.SOUTH_EAST; } else if (y < lastY) { return Direction.NORTH_EAST; } else { return Direction.EAST; } } else if (x < lastX) // west { if (y > lastY) { return Direction.SOUTH_WEST; } else if (y < lastY) { return Direction.NORTH_WEST; } else { return Direction.WEST; } } else // unchanged x { if (y > lastY) { return Direction.SOUTH; } else if (y < lastY) { return Direction.NORTH; } else { return null;// error, should never happen, TODO: Logging } } } }