/* * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that * it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If * not, see <http://www.gnu.org/licenses/>. */ package silentium.gameserver.model.actor.instance; import java.util.Calendar; import java.util.StringTokenizer; import silentium.gameserver.configs.NPCConfig; import silentium.gameserver.configs.PlayersConfig; import silentium.gameserver.data.html.HtmCache; import silentium.gameserver.data.html.StaticHtmPath; import silentium.gameserver.data.xml.TeleportLocationData; import silentium.gameserver.instancemanager.CastleManager; import silentium.gameserver.instancemanager.SiegeManager; import silentium.gameserver.instancemanager.TownManager; import silentium.gameserver.model.L2TeleportLocation; import silentium.gameserver.model.actor.L2Character; import silentium.gameserver.network.SystemMessageId; import silentium.gameserver.network.serverpackets.ActionFailed; import silentium.gameserver.network.serverpackets.NpcHtmlMessage; import silentium.gameserver.templates.chars.L2NpcTemplate; /** * @author NightMarez */ public final class L2TeleporterInstance extends L2NpcInstance { private static final int COND_ALL_FALSE = 0; private static final int COND_BUSY_BECAUSE_OF_SIEGE = 1; private static final int COND_OWNER = 2; private static final int COND_REGULAR = 3; public L2TeleporterInstance(int objectId, L2NpcTemplate template) { super(objectId, template); } @Override public void onBypassFeedback(L2PcInstance player, String command) { player.sendPacket(ActionFailed.STATIC_PACKET); int condition = validateCondition(player); StringTokenizer st = new StringTokenizer(command, " "); String actualCommand = st.nextToken(); // Get actual command if (actualCommand.equalsIgnoreCase("goto")) { if (st.countTokens() <= 0) return; if (condition == COND_REGULAR || condition == COND_OWNER) { doTeleport(player, Integer.parseInt(st.nextToken())); return; } } else if (command.startsWith("Chat")) { Calendar cal = Calendar.getInstance(); int val = 0; try { val = Integer.parseInt(command.substring(5)); } catch (IndexOutOfBoundsException ioobe) { } catch (NumberFormatException nfe) { } if (val == 1 && cal.get(Calendar.HOUR_OF_DAY) >= 20 && cal.get(Calendar.HOUR_OF_DAY) <= 23 && (cal.get(Calendar.DAY_OF_WEEK) == 1 || cal.get(Calendar.DAY_OF_WEEK) == 7)) { showHalfPriceHtml(player); return; } showChatWindow(player, val); } else super.onBypassFeedback(player, command); } @Override public String getHtmlPath(int npcId, int val) { String pom = ""; if (val == 0) pom = "" + npcId; else pom = npcId + "-" + val; return StaticHtmPath.TeleporterHtmPath + pom + ".htm"; } private void showHalfPriceHtml(L2PcInstance player) { if (player == null) return; final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); String filename = StaticHtmPath.TeleporterHtmPath + "half/" + getNpcId() + ".htm"; if (!HtmCache.isLoadable(filename)) filename = StaticHtmPath.TeleporterHtmPath + getNpcId() + "-1.htm"; html.setFile(filename, player); html.replace("%objectId%", String.valueOf(getObjectId())); html.replace("%npcname%", getName()); player.sendPacket(html); } @Override public void showChatWindow(L2PcInstance player) { String filename = StaticHtmPath.TeleporterHtmPath + "castleteleporter-no.htm"; int condition = validateCondition(player); if (condition == COND_REGULAR) { super.showChatWindow(player); return; } else if (condition > COND_ALL_FALSE) { if (condition == COND_BUSY_BECAUSE_OF_SIEGE) filename = StaticHtmPath.TeleporterHtmPath + "castleteleporter-busy.htm"; // Busy because of siege else if (condition == COND_OWNER) // Clan owns castle filename = getHtmlPath(getNpcId(), 0); // Owner message window } NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); html.setFile(filename, player); html.replace("%objectId%", String.valueOf(getObjectId())); html.replace("%npcname%", getName()); player.sendPacket(html); } private void doTeleport(L2PcInstance player, int val) { L2TeleportLocation list = TeleportLocationData.getInstance().getTemplate(val); if (list != null) { // you cannot teleport to village that is in siege if (SiegeManager.getSiege(list.getLocX(), list.getLocY(), list.getLocZ()) != null) { player.sendPacket(SystemMessageId.NO_PORT_THAT_IS_IN_SIGE); return; } else if (TownManager.townHasCastleInSiege(list.getLocX(), list.getLocY()) && isInsideZone(L2Character.ZONE_TOWN)) { player.sendPacket(SystemMessageId.NO_PORT_THAT_IS_IN_SIGE); return; } else if (!PlayersConfig.KARMA_PLAYER_CAN_USE_GK && player.getKarma() > 0) // karma { player.sendMessage("Go away, you're not welcome here."); return; } else if (list.getIsForNoble() && !player.isNoble()) { NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); html.setFile(StaticHtmPath.TeleporterHtmPath + "nobleteleporter-no.htm", player); html.replace("%objectId%", String.valueOf(getObjectId())); html.replace("%npcname%", getName()); player.sendPacket(html); return; } else if (player.isAlikeDead()) return; Calendar cal = Calendar.getInstance(); int price = list.getPrice(); if (!list.getIsForNoble()) { if (cal.get(Calendar.HOUR_OF_DAY) >= 20 && cal.get(Calendar.HOUR_OF_DAY) <= 23 && (cal.get(Calendar.DAY_OF_WEEK) == 1 || cal.get(Calendar.DAY_OF_WEEK) == 7)) price /= 2; } if (NPCConfig.ALT_GAME_FREE_TELEPORT || player.destroyItemByItemId("Teleport " + (list.getIsForNoble() ? " nobless" : ""), 57, price, this, true)) { _log.debug("Teleporting player " + player.getName() + " to new location: " + list.getLocX() + ":" + list.getLocY() + ":" + list.getLocZ()); player.teleToLocation(list.getLocX(), list.getLocY(), list.getLocZ(), true); } } else _log.warn("No teleport destination with id:" + val); player.sendPacket(ActionFailed.STATIC_PACKET); } private int validateCondition(L2PcInstance player) { if (CastleManager.getInstance().getCastleIndex(this) < 0) // Teleporter isn't on castle ground return COND_REGULAR; // Regular access else if (getCastle().getSiege().getIsInProgress()) // Teleporter is on castle ground and siege is in progress return COND_BUSY_BECAUSE_OF_SIEGE; // Busy because of siege else if (player.getClan() != null) // Teleporter is on castle ground and player is in a clan { if (getCastle().getOwnerId() == player.getClanId()) // Clan owns castle return COND_OWNER; // Owner } return COND_ALL_FALSE; } }