BORDIR 62 Опубликовано 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); } } Суть в том, что никак не могу найти, где происходит сама телепортация. Неужто удаление персонажа из локации и перемещение в другую происходит на уровне клиента только лишь по посылке этого пакета? Есть ли какой-нибудь код, которого я не нашел на серверном уровне? Заранее спасибо за помощь. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
SoFace 315 Опубликовано 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); Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
LifeGame32 312 Опубликовано 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. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 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); Это просто пакет от сервера клиенту. Сама телепортация происходит в L2Character Метод public void teleToLocation(int x, int y, int z, int heading, int instanceId, int randomOffset) По L2J. Спасибо. Именно из этого класса я и пришел к пакету TeleportToLocation. Здесь все верно, все понятно. Но ведь механизма телепорта в teleToLocation нет, а именно он мне и нужен. Какой механизм? Давайте посмотрим, что происходит при телепортации: Персонаж удаляется из зоны, а так же удаляются нпс и игроки в зоне, который был персонаж, затем гаснет экран, а персонаж появляется в новой локации и получает пакеты, содержащие информацию о самом персонаже и о персонажах и нпс, окружающих его. Вот тот алгоритм, который я ищу. Если же он есть в teleToLocation, пожалуйста, укажите мне на него, я найти не смог. Или же все, что я описал выше происходит автоматически при посылке пакета TeleportToLocation? Очень уж слабо верится. Еще раз спасибо. Изменено 4 июля, 2014 пользователем BORDIR Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BORDIR 62 Опубликовано 4 июля, 2014 (изменено) Наглядная демонстрация того, что я ищу. P.S. не работает? Изменено 4 июля, 2014 пользователем BORDIR Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
LifeGame32 312 Опубликовано 4 июля, 2014 (изменено) Наглядная демонстрация того, что я ищу. 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); } Изменено 4 июля, 2014 пользователем LifeGame32 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты