Jump to content
Sign in to follow this  
BORDIR

Teleporttolocation

Recommended Posts

Добрый день.

 

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

 

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

Не совсем, есть метод 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

Добрый день.

 

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

 

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

Не совсем, есть метод 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 by BORDIR

Share this post


Link to post
Share on other sites

pre_1404488770___-3.jpg

 

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

 

P.S.

не работает?

Edited by BORDIR

Share this post


Link to post
Share on other sites

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

}

Edited by LifeGame32

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...