Перейти к содержанию
Авторизация  
BORDIR

Teleporttolocation

Рекомендуемые сообщения

Добрый день.

 

Возникла проблема следующего характера: Подскажите, пожалуйста, как работает телепортация персонажа? Либо я плохо искал, либо что-то не понимаю.

 

Класс 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);
}
}

 

Суть в том, что никак не могу найти, где происходит сама телепортация. Неужто удаление персонажа из локации и перемещение в другую происходит на уровне клиента только лишь по посылке этого пакета? Есть ли какой-нибудь код, которого я не нашел на серверном уровне?

 

Заранее спасибо за помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем, есть метод teleToLocation, из этого метода передаётся управление на пакет TeleportToLocation.

Например:

int x = 1;
int y = 1;
int z = 1;
broadcastPacket(new TeleportToLocation(this, x, y, z));

 

Или же просто:

teleToLocation(player, x, y, z);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день.

 

Возникла проблема следующего характера: Подскажите, пожалуйста, как работает телепортация персонажа? Либо я плохо искал, либо что-то не понимаю.

 

Класс 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем, есть метод 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? Очень уж слабо верится.

 

Еще раз спасибо.

Изменено пользователем BORDIR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

pre_1404488770___-3.jpg

 

Наглядная демонстрация того, что я ищу.

 

P.S.

не работает?

Изменено пользователем BORDIR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

pre_1404488770___-3.jpg

 

Наглядная демонстрация того, что я ищу.

 

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);

}

Изменено пользователем LifeGame32

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...