BORDIR 62 Posted July 4, 2014 Добрый день. Возникла проблема следующего характера: Подскажите, пожалуйста, как работает телепортация персонажа? Либо я плохо искал, либо что-то не понимаю. Класс TeleportToLocation выглядит следующим образом: public class TeleportToLocation extends L2GameServerPacket { private int _targetId; private Location _loc; public TeleportToLocation(GameObject cha, Location loc) { _targetId = cha.getObjectId(); _loc = loc; } public TeleportToLocation(GameObject cha, int x, int y, int z) { _targetId = cha.getObjectId(); _loc = new Location(x, y, z, cha.getHeading()); } @Override protected final void writeImpl() { writeC(0x22); writeD(_targetId); writeD(_loc.x); writeD(_loc.y); writeD(_loc.z + Config.CLIENT_Z_SHIFT); writeD(0x00); //IsValidation writeD(_loc.h); } } Суть в том, что никак не могу найти, где происходит сама телепортация. Неужто удаление персонажа из локации и перемещение в другую происходит на уровне клиента только лишь по посылке этого пакета? Есть ли какой-нибудь код, которого я не нашел на серверном уровне? Заранее спасибо за помощь. Share this post Link to post Share on other sites
SoFace 315 Posted July 4, 2014 Не совсем, есть метод teleToLocation, из этого метода передаётся управление на пакет TeleportToLocation. Например: int x = 1; int y = 1; int z = 1; broadcastPacket(new TeleportToLocation(this, x, y, z)); Или же просто: teleToLocation(player, x, y, z); Share this post Link to post Share on other sites
LifeGame32 312 Posted July 4, 2014 Добрый день. Возникла проблема следующего характера: Подскажите, пожалуйста, как работает телепортация персонажа? Либо я плохо искал, либо что-то не понимаю. Класс TeleportToLocation выглядит следующим образом: public class TeleportToLocation extends L2GameServerPacket { private int _targetId; private Location _loc; public TeleportToLocation(GameObject cha, Location loc) { _targetId = cha.getObjectId(); _loc = loc; } public TeleportToLocation(GameObject cha, int x, int y, int z) { _targetId = cha.getObjectId(); _loc = new Location(x, y, z, cha.getHeading()); } @Override protected final void writeImpl() { writeC(0x22); writeD(_targetId); writeD(_loc.x); writeD(_loc.y); writeD(_loc.z + Config.CLIENT_Z_SHIFT); writeD(0x00); //IsValidation writeD(_loc.h); } } Суть в том, что никак не могу найти, где происходит сама телепортация. Неужто удаление персонажа из локации и перемещение в другую происходит на уровне клиента только лишь по посылке этого пакета? Есть ли какой-нибудь код, которого я не нашел на серверном уровне? Заранее спасибо за помощь. Это просто пакет от сервера клиенту. Сама телепортация происходит в L2Character Метод public void teleToLocation(int x, int y, int z, int heading, int instanceId, int randomOffset) По L2J. Share this post Link to post Share on other sites
BORDIR 62 Posted July 4, 2014 (edited) Не совсем, есть метод teleToLocation, из этого метода передаётся управление на пакет TeleportToLocation. Например: int x = 1; int y = 1; int z = 1; broadcastPacket(new TeleportToLocation(this, x, y, z)); Или же просто: teleToLocation(player, x, y, z); Это просто пакет от сервера клиенту. Сама телепортация происходит в L2Character Метод public void teleToLocation(int x, int y, int z, int heading, int instanceId, int randomOffset) По L2J. Спасибо. Именно из этого класса я и пришел к пакету TeleportToLocation. Здесь все верно, все понятно. Но ведь механизма телепорта в teleToLocation нет, а именно он мне и нужен. Какой механизм? Давайте посмотрим, что происходит при телепортации: Персонаж удаляется из зоны, а так же удаляются нпс и игроки в зоне, который был персонаж, затем гаснет экран, а персонаж появляется в новой локации и получает пакеты, содержащие информацию о самом персонаже и о персонажах и нпс, окружающих его. Вот тот алгоритм, который я ищу. Если же он есть в teleToLocation, пожалуйста, укажите мне на него, я найти не смог. Или же все, что я описал выше происходит автоматически при посылке пакета TeleportToLocation? Очень уж слабо верится. Еще раз спасибо. Edited July 4, 2014 by BORDIR Share this post Link to post Share on other sites
BORDIR 62 Posted July 4, 2014 (edited) Наглядная демонстрация того, что я ищу. P.S. не работает? Edited July 4, 2014 by BORDIR Share this post Link to post Share on other sites
LifeGame32 312 Posted July 4, 2014 (edited) Наглядная демонстрация того, что я ищу. P.S. не работает? Проект в IDE и смотрите где откуда что вызывается кем и куда. NpcInfo и CharInfo формируется из одного класса CharInfo.java /** * Teleport a L2Character and its pet if necessary. * Actions: * * Stop the movement of the L2Character* Set the x,y,z position of the L2Object and if necessary modify its _worldRegion* Send a Server->Client packet TeleportToLocationt to the L2Character AND to all L2PcInstance in its _KnownPlayers* Modify the position of the pet if necessary* * @param x * @param y * @param z * @param heading * @param instanceId * @param randomOffset */ public void teleToLocation(int x, int y, int z, int heading, int instanceId, int randomOffset) { setInstanceId(instanceId); if (isPlayer() && DimensionalRiftManager.getInstance().checkIfInRiftZone(getX(), getY(), getZ(), false)) // true -> ignore waiting room { L2PcInstance player = getActingPlayer(); player.sendMessage("You have been sent to the waiting room."); if (player.isInParty() && player.getParty().isInDimensionalRift()) { player.getParty().getDimensionalRift().usedTeleport(player); } int[] newCoords = DimensionalRiftManager.getInstance().getRoom((byte) 0, (byte) 0).getTeleportCoorinates(); x = newCoords[0]; y = newCoords[1]; z = newCoords[2]; } if (_isPendingRevive) { doRevive(); } stopMove(null, false); abortAttack(); abortCast(); setIsTeleporting(true); setTarget(null); getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); if (Config.OFFSET_ON_TELEPORT_ENABLED && (randomOffset > 0)) { x += Rnd.get(-randomOffset, randomOffset); y += Rnd.get(-randomOffset, randomOffset); } z += 5; // Send a Server->Client packet TeleportToLocationt to the L2Character AND to all L2PcInstance in the _KnownPlayers of the L2Character broadcastPacket(new TeleportToLocation(this, x, y, z, heading)); // remove the object from its old location decayMe(); // Set the x,y,z position of the L2Object and if necessary modify its _worldRegion setXYZ(x, y, z); // temporary fix for heading on teleports if (heading != 0) { setHeading(heading); } // allow recall of the detached characters if (!isPlayer() || ((getActingPlayer().getClient() != null) && getActingPlayer().getClient().isDetached())) { onTeleported(); } revalidateZone(true); } Edited July 4, 2014 by LifeGame32 Share this post Link to post Share on other sites