/*
* 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;
}
}