Improved requesting teleport method.

This commit is contained in:
MobiusDevelopment 2019-10-07 14:55:19 +00:00
parent 282d84a65f
commit a942671449
4 changed files with 74 additions and 62 deletions

View File

@ -17,8 +17,8 @@
package org.l2jmobius.gameserver.data.xml.impl; package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.HashMap;
import java.util.List; import java.util.Map;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.w3c.dom.Document; import org.w3c.dom.Document;
@ -28,12 +28,12 @@ import org.l2jmobius.gameserver.model.StatsSet;
import org.l2jmobius.gameserver.model.holders.TeleportListHolder; import org.l2jmobius.gameserver.model.holders.TeleportListHolder;
/** /**
* @author NviX * @author NviX, Mobius
*/ */
public class TeleportListData implements IXmlReader public class TeleportListData implements IXmlReader
{ {
private static Logger LOGGER = Logger.getLogger(TeleportListData.class.getName()); private static Logger LOGGER = Logger.getLogger(TeleportListData.class.getName());
private final List<TeleportListHolder> _teleports = new ArrayList<>(); private final Map<Integer, TeleportListHolder> _teleports = new HashMap<>();
private int _teleportsCount = 0; private int _teleportsCount = 0;
protected TeleportListData() protected TeleportListData()
@ -61,13 +61,13 @@ public class TeleportListData implements IXmlReader
final int y = set.getInt("y"); final int y = set.getInt("y");
final int z = set.getInt("z"); final int z = set.getInt("z");
final int tpPrice = set.getInt("price"); final int tpPrice = set.getInt("price");
_teleports.add(new TeleportListHolder(tpId, x, y, z, tpPrice)); _teleports.put(tpId, new TeleportListHolder(tpId, x, y, z, tpPrice));
})); }));
} }
public List<TeleportListHolder> getTeleports() public TeleportListHolder getTeleport(int teleportId)
{ {
return _teleports; return _teleports.get(teleportId);
} }
public int getTeleportsCount() public int getTeleportsCount()

View File

@ -16,24 +16,27 @@
*/ */
package org.l2jmobius.gameserver.network.clientpackets; package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.impl.TeleportListData; import org.l2jmobius.gameserver.data.xml.impl.TeleportListData;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.entity.Castle;
import org.l2jmobius.gameserver.model.holders.TeleportListHolder; import org.l2jmobius.gameserver.model.holders.TeleportListHolder;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
/** /**
* @author NviX * @author NviX, Mobius
*/ */
public class ExRequestTeleport implements IClientIncomingPacket public class ExRequestTeleport implements IClientIncomingPacket
{ {
private int _locId; private int _teleportId;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
{ {
_locId = packet.readD(); _teleportId = packet.readD();
return true; return true;
} }
@ -46,29 +49,32 @@ public class ExRequestTeleport implements IClientIncomingPacket
return; return;
} }
boolean success = false; final TeleportListHolder teleport = TeleportListData.getInstance().getTeleport(_teleportId);
if (teleport == null)
for (TeleportListHolder teleport : TeleportListData.getInstance().getTeleports())
{ {
if (teleport.getLocId() == _locId) LOGGER.info("No registered teleport location for id: " + _teleportId);
{
if (player.getAdena() < teleport.getPrice())
{
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ADENA);
return;
}
player.reduceAdena("teleport", teleport.getPrice(), player, true);
player.teleToLocation(teleport.getX(), teleport.getY(), teleport.getZ());
success = true;
break;
}
}
if (!success)
{
LOGGER.info("No registered teleport location for id: " + _locId);
return; return;
} }
final Castle castle = CastleManager.getInstance().getCastle(teleport.getX(), teleport.getY(), teleport.getZ());
if ((castle != null) && castle.getSiege().isInProgress())
{
player.sendPacket(SystemMessageId.YOU_CANNOT_TELEPORT_TO_A_VILLAGE_THAT_IS_IN_A_SIEGE);
return;
}
final boolean mustPay = player.getLevel() > Config.MAX_FREE_TELEPORT_LEVEL;
final int price = teleport.getPrice();
if (mustPay && (price > 0))
{
if (player.getAdena() < price)
{
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ADENA);
return;
}
player.reduceAdena("Teleport", price, player, true);
}
player.teleToLocation(teleport.getX(), teleport.getY(), teleport.getZ());
} }
} }

View File

@ -17,8 +17,8 @@
package org.l2jmobius.gameserver.data.xml.impl; package org.l2jmobius.gameserver.data.xml.impl;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.HashMap;
import java.util.List; import java.util.Map;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.w3c.dom.Document; import org.w3c.dom.Document;
@ -28,12 +28,12 @@ import org.l2jmobius.gameserver.model.StatsSet;
import org.l2jmobius.gameserver.model.holders.TeleportListHolder; import org.l2jmobius.gameserver.model.holders.TeleportListHolder;
/** /**
* @author NviX * @author NviX, Mobius
*/ */
public class TeleportListData implements IXmlReader public class TeleportListData implements IXmlReader
{ {
private static Logger LOGGER = Logger.getLogger(TeleportListData.class.getName()); private static Logger LOGGER = Logger.getLogger(TeleportListData.class.getName());
private final List<TeleportListHolder> _teleports = new ArrayList<>(); private final Map<Integer, TeleportListHolder> _teleports = new HashMap<>();
private int _teleportsCount = 0; private int _teleportsCount = 0;
protected TeleportListData() protected TeleportListData()
@ -61,13 +61,13 @@ public class TeleportListData implements IXmlReader
final int y = set.getInt("y"); final int y = set.getInt("y");
final int z = set.getInt("z"); final int z = set.getInt("z");
final int tpPrice = set.getInt("price"); final int tpPrice = set.getInt("price");
_teleports.add(new TeleportListHolder(tpId, x, y, z, tpPrice)); _teleports.put(tpId, new TeleportListHolder(tpId, x, y, z, tpPrice));
})); }));
} }
public List<TeleportListHolder> getTeleports() public TeleportListHolder getTeleport(int teleportId)
{ {
return _teleports; return _teleports.get(teleportId);
} }
public int getTeleportsCount() public int getTeleportsCount()

View File

@ -16,24 +16,27 @@
*/ */
package org.l2jmobius.gameserver.network.clientpackets; package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.impl.TeleportListData; import org.l2jmobius.gameserver.data.xml.impl.TeleportListData;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.entity.Castle;
import org.l2jmobius.gameserver.model.holders.TeleportListHolder; import org.l2jmobius.gameserver.model.holders.TeleportListHolder;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
/** /**
* @author NviX * @author NviX, Mobius
*/ */
public class ExRequestTeleport implements IClientIncomingPacket public class ExRequestTeleport implements IClientIncomingPacket
{ {
private int _locId; private int _teleportId;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
{ {
_locId = packet.readD(); _teleportId = packet.readD();
return true; return true;
} }
@ -46,29 +49,32 @@ public class ExRequestTeleport implements IClientIncomingPacket
return; return;
} }
boolean success = false; final TeleportListHolder teleport = TeleportListData.getInstance().getTeleport(_teleportId);
if (teleport == null)
for (TeleportListHolder teleport : TeleportListData.getInstance().getTeleports())
{ {
if (teleport.getLocId() == _locId) LOGGER.info("No registered teleport location for id: " + _teleportId);
{
if (player.getAdena() < teleport.getPrice())
{
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ADENA);
return;
}
player.reduceAdena("teleport", teleport.getPrice(), player, true);
player.teleToLocation(teleport.getX(), teleport.getY(), teleport.getZ());
success = true;
break;
}
}
if (!success)
{
LOGGER.info("No registered teleport location for id: " + _locId);
return; return;
} }
final Castle castle = CastleManager.getInstance().getCastle(teleport.getX(), teleport.getY(), teleport.getZ());
if ((castle != null) && castle.getSiege().isInProgress())
{
player.sendPacket(SystemMessageId.YOU_CANNOT_TELEPORT_TO_A_VILLAGE_THAT_IS_IN_A_SIEGE);
return;
}
final boolean mustPay = player.getLevel() > Config.MAX_FREE_TELEPORT_LEVEL;
final int price = teleport.getPrice();
if (mustPay && (price > 0))
{
if (player.getAdena() < price)
{
player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ADENA);
return;
}
player.reduceAdena("Teleport", price, player, true);
}
player.teleToLocation(teleport.getX(), teleport.getY(), teleport.getZ());
} }
} }