/*
* Copyright (C) 2004-2015 L2J Server
*
* This file is part of L2J Server.
*
* L2J Server 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.
*
* L2J Server 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 com.l2jserver.gameserver.model.actor.instance;
import java.text.SimpleDateFormat;
import java.util.StringTokenizer;
import com.l2jserver.Config;
import com.l2jserver.gameserver.cache.HtmCache;
import com.l2jserver.gameserver.data.sql.impl.TeleportLocationTable;
import com.l2jserver.gameserver.datatables.SkillData;
import com.l2jserver.gameserver.enums.InstanceType;
import com.l2jserver.gameserver.model.ClanPrivilege;
import com.l2jserver.gameserver.model.L2TeleportLocation;
import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
import com.l2jserver.gameserver.model.effects.L2EffectType;
import com.l2jserver.gameserver.model.entity.Fort;
import com.l2jserver.gameserver.model.skills.Skill;
import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
import com.l2jserver.gameserver.network.serverpackets.SortedWareHouseWithdrawalList;
import com.l2jserver.gameserver.network.serverpackets.SortedWareHouseWithdrawalList.WarehouseListType;
import com.l2jserver.gameserver.network.serverpackets.WareHouseDepositList;
import com.l2jserver.gameserver.network.serverpackets.WareHouseWithdrawalList;
/**
* Fortress Foreman implementation used for: Area Teleports, Support Magic, Clan Warehouse, Exp Loss Reduction
*/
public class L2FortManagerInstance extends L2MerchantInstance
{
protected static final int COND_ALL_FALSE = 0;
protected static final int COND_BUSY_BECAUSE_OF_SIEGE = 1;
protected static final int COND_OWNER = 2;
/**
* Creates a fort manager.
* @param template the fort manager NPC template
*/
public L2FortManagerInstance(L2NpcTemplate template)
{
super(template);
setInstanceType(InstanceType.L2FortManagerInstance);
}
@Override
public boolean isWarehouse()
{
return true;
}
private void sendHtmlMessage(L2PcInstance player, NpcHtmlMessage html)
{
html.replace("%objectId%", String.valueOf(getObjectId()));
html.replace("%npcId%", String.valueOf(getId()));
player.sendPacket(html);
}
@Override
public void onBypassFeedback(L2PcInstance player, String command)
{
// BypassValidation Exploit plug.
if (player.getLastFolkNPC().getObjectId() != getObjectId())
{
return;
}
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm");
int condition = validateCondition(player);
if (condition <= COND_ALL_FALSE)
{
return;
}
else if (condition == COND_BUSY_BECAUSE_OF_SIEGE)
{
return;
}
else if (condition == COND_OWNER)
{
StringTokenizer st = new StringTokenizer(command, " ");
String actualCommand = st.nextToken(); // Get actual command
String val = "";
if (st.countTokens() >= 1)
{
val = st.nextToken();
}
if (actualCommand.equalsIgnoreCase("expel"))
{
if (player.hasClanPrivilege(ClanPrivilege.CS_DISMISS))
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-expel.htm");
html.replace("%objectId%", String.valueOf(getObjectId()));
player.sendPacket(html);
}
else
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-noprivs.htm");
html.replace("%objectId%", String.valueOf(getObjectId()));
player.sendPacket(html);
}
return;
}
else if (actualCommand.equalsIgnoreCase("banish_foreigner"))
{
if (player.hasClanPrivilege(ClanPrivilege.CS_DISMISS))
{
getFort().banishForeigners(); // Move non-clan members off fortress area
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-expeled.htm");
html.replace("%objectId%", String.valueOf(getObjectId()));
player.sendPacket(html);
}
else
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-noprivs.htm");
html.replace("%objectId%", String.valueOf(getObjectId()));
player.sendPacket(html);
}
return;
}
else if (actualCommand.equalsIgnoreCase("receive_report"))
{
if (getFort().getFortState() < 2)
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-report.htm");
html.replace("%objectId%", String.valueOf(getObjectId()));
if (Config.FS_MAX_OWN_TIME > 0)
{
int hour = (int) Math.floor(getFort().getTimeTillRebelArmy() / 3600);
int minutes = (int) (Math.floor(getFort().getTimeTillRebelArmy() - (hour * 3600)) / 60);
html.replace("%hr%", String.valueOf(hour));
html.replace("%min%", String.valueOf(minutes));
}
else
{
int hour = (int) Math.floor(getFort().getOwnedTime() / 3600);
int minutes = (int) (Math.floor(getFort().getOwnedTime() - (hour * 3600)) / 60);
html.replace("%hr%", String.valueOf(hour));
html.replace("%min%", String.valueOf(minutes));
}
player.sendPacket(html);
}
else
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-castlereport.htm");
html.replace("%objectId%", String.valueOf(getObjectId()));
int hour, minutes;
if (Config.FS_MAX_OWN_TIME > 0)
{
hour = (int) Math.floor(getFort().getTimeTillRebelArmy() / 3600);
minutes = (int) (Math.floor(getFort().getTimeTillRebelArmy() - (hour * 3600)) / 60);
html.replace("%hr%", String.valueOf(hour));
html.replace("%min%", String.valueOf(minutes));
}
else
{
hour = (int) Math.floor(getFort().getOwnedTime() / 3600);
minutes = (int) (Math.floor(getFort().getOwnedTime() - (hour * 3600)) / 60);
html.replace("%hr%", String.valueOf(hour));
html.replace("%min%", String.valueOf(minutes));
}
hour = (int) Math.floor(getFort().getTimeTillNextFortUpdate() / 3600);
minutes = (int) (Math.floor(getFort().getTimeTillNextFortUpdate() - (hour * 3600)) / 60);
html.replace("%castle%", getFort().getContractedCastle().getName());
html.replace("%hr2%", String.valueOf(hour));
html.replace("%min2%", String.valueOf(minutes));
player.sendPacket(html);
}
return;
}
else if (actualCommand.equalsIgnoreCase("operate_door")) // door
// control
{
if (player.hasClanPrivilege(ClanPrivilege.CS_OPEN_DOOR))
{
if (!val.isEmpty())
{
boolean open = (Integer.parseInt(val) == 1);
while (st.hasMoreTokens())
{
getFort().openCloseDoor(player, Integer.parseInt(st.nextToken()), open);
}
if (open)
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-opened.htm");
html.replace("%objectId%", String.valueOf(getObjectId()));
player.sendPacket(html);
}
else
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-closed.htm");
html.replace("%objectId%", String.valueOf(getObjectId()));
player.sendPacket(html);
}
}
else
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/" + getTemplate().getId() + "-d.htm");
html.replace("%objectId%", String.valueOf(getObjectId()));
html.replace("%npcname%", getName());
player.sendPacket(html);
}
}
else
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-noprivs.htm");
html.replace("%objectId%", String.valueOf(getObjectId()));
player.sendPacket(html);
}
return;
}
else if (actualCommand.equalsIgnoreCase("manage_vault"))
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
if (player.hasClanPrivilege(ClanPrivilege.CL_VIEW_WAREHOUSE))
{
if (val.equalsIgnoreCase("deposit"))
{
showVaultWindowDeposit(player);
}
else if (val.equalsIgnoreCase("withdraw"))
{
if (Config.L2JMOD_ENABLE_WAREHOUSESORTING_CLAN)
{
String htmFile = "data/html/mods/WhSortedC.htm";
String htmContent = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), htmFile);
if (htmContent != null)
{
final NpcHtmlMessage npcHtmlMessage = new NpcHtmlMessage(getObjectId());
npcHtmlMessage.setHtml(htmContent);
npcHtmlMessage.replace("%objectId%", String.valueOf(getObjectId()));
player.sendPacket(npcHtmlMessage);
}
else
{
_log.warning("Missing htm: " + htmFile + " !");
}
}
else
{
showVaultWindowWithdraw(player, null, (byte) 0);
}
}
else
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-vault.htm");
sendHtmlMessage(player, html);
}
}
else
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-noprivs.htm");
sendHtmlMessage(player, html);
}
return;
}
else if (actualCommand.startsWith("WithdrawSortedC"))
{
String param[] = command.split("_");
if (param.length > 2)
{
showVaultWindowWithdraw(player, WarehouseListType.valueOf(param[1]), SortedWareHouseWithdrawalList.getOrder(param[2]));
}
else if (param.length > 1)
{
showVaultWindowWithdraw(player, WarehouseListType.valueOf(param[1]), SortedWareHouseWithdrawalList.A2Z);
}
else
{
showVaultWindowWithdraw(player, WarehouseListType.ALL, SortedWareHouseWithdrawalList.A2Z);
}
return;
}
else if (actualCommand.equalsIgnoreCase("functions"))
{
if (val.equalsIgnoreCase("tele"))
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
if (getFort().getFunction(Fort.FUNC_TELEPORT) == null)
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-nac.htm");
}
else
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/" + getId() + "-t" + getFort().getFunction(Fort.FUNC_TELEPORT).getLvl() + ".htm");
}
sendHtmlMessage(player, html);
}
else if (val.equalsIgnoreCase("support"))
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
if (getFort().getFunction(Fort.FUNC_SUPPORT) == null)
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-nac.htm");
}
else
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/support" + getFort().getFunction(Fort.FUNC_SUPPORT).getLvl() + ".htm");
html.replace("%mp%", String.valueOf((int) getCurrentMp()));
}
sendHtmlMessage(player, html);
}
else if (val.equalsIgnoreCase("back"))
{
showChatWindow(player);
}
else
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-functions.htm");
if (getFort().getFunction(Fort.FUNC_RESTORE_EXP) != null)
{
html.replace("%xp_regen%", String.valueOf(getFort().getFunction(Fort.FUNC_RESTORE_EXP).getLvl()));
}
else
{
html.replace("%xp_regen%", "0");
}
if (getFort().getFunction(Fort.FUNC_RESTORE_HP) != null)
{
html.replace("%hp_regen%", String.valueOf(getFort().getFunction(Fort.FUNC_RESTORE_HP).getLvl()));
}
else
{
html.replace("%hp_regen%", "0");
}
if (getFort().getFunction(Fort.FUNC_RESTORE_MP) != null)
{
html.replace("%mp_regen%", String.valueOf(getFort().getFunction(Fort.FUNC_RESTORE_MP).getLvl()));
}
else
{
html.replace("%mp_regen%", "0");
}
sendHtmlMessage(player, html);
}
return;
}
else if (actualCommand.equalsIgnoreCase("manage"))
{
if (player.hasClanPrivilege(ClanPrivilege.CS_SET_FUNCTIONS))
{
if (val.equalsIgnoreCase("recovery"))
{
if (st.countTokens() >= 1)
{
if (getFort().getOwnerClan() == null)
{
player.sendMessage("This fortress has no owner, you cannot change the configuration.");
return;
}
val = st.nextToken();
if (val.equalsIgnoreCase("hp_cancel"))
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-cancel.htm");
html.replace("%apply%", "recovery hp 0");
sendHtmlMessage(player, html);
return;
}
else if (val.equalsIgnoreCase("mp_cancel"))
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-cancel.htm");
html.replace("%apply%", "recovery mp 0");
sendHtmlMessage(player, html);
return;
}
else if (val.equalsIgnoreCase("exp_cancel"))
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-cancel.htm");
html.replace("%apply%", "recovery exp 0");
sendHtmlMessage(player, html);
return;
}
else if (val.equalsIgnoreCase("edit_hp"))
{
val = st.nextToken();
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-apply.htm");
html.replace("%name%", "(HP Recovery Device)");
int percent = Integer.parseInt(val);
int cost;
switch (percent)
{
case 300:
cost = Config.FS_HPREG1_FEE;
break;
default: // 400
cost = Config.FS_HPREG2_FEE;
break;
}
html.replace("%cost%", String.valueOf(cost) + "</font>Adena /" + String.valueOf(Config.FS_HPREG_FEE_RATIO / 1000 / 60 / 60 / 24) + " Day</font>)");
html.replace("%use%", "Provides additional HP recovery for clan members in the fortress.<font color=\"00FFFF\">" + String.valueOf(percent) + "%</font>");
html.replace("%apply%", "recovery hp " + String.valueOf(percent));
sendHtmlMessage(player, html);
return;
}
else if (val.equalsIgnoreCase("edit_mp"))
{
val = st.nextToken();
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-apply.htm");
html.replace("%name%", "(MP Recovery)");
int percent = Integer.parseInt(val);
int cost;
switch (percent)
{
case 40:
cost = Config.FS_MPREG1_FEE;
break;
default: // 50
cost = Config.FS_MPREG2_FEE;
break;
}
html.replace("%cost%", String.valueOf(cost) + "</font>Adena /" + String.valueOf(Config.FS_MPREG_FEE_RATIO / 1000 / 60 / 60 / 24) + " Day</font>)");
html.replace("%use%", "Provides additional MP recovery for clan members in the fortress.<font color=\"00FFFF\">" + String.valueOf(percent) + "%</font>");
html.replace("%apply%", "recovery mp " + String.valueOf(percent));
sendHtmlMessage(player, html);
return;
}
else if (val.equalsIgnoreCase("edit_exp"))
{
val = st.nextToken();
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-apply.htm");
html.replace("%name%", "(EXP Recovery Device)");
int percent = Integer.parseInt(val);
int cost;
switch (percent)
{
case 45:
cost = Config.FS_EXPREG1_FEE;
break;
default: // 50
cost = Config.FS_EXPREG2_FEE;
break;
}
html.replace("%cost%", String.valueOf(cost) + "</font>Adena /" + String.valueOf(Config.FS_EXPREG_FEE_RATIO / 1000 / 60 / 60 / 24) + " Day</font>)");
html.replace("%use%", "Restores the Exp of any clan member who is resurrected in the fortress.<font color=\"00FFFF\">" + String.valueOf(percent) + "%</font>");
html.replace("%apply%", "recovery exp " + String.valueOf(percent));
sendHtmlMessage(player, html);
return;
}
else if (val.equalsIgnoreCase("hp"))
{
if (st.countTokens() >= 1)
{
int fee;
if (Config.DEBUG)
{
_log.warning("Mp editing invoked");
}
val = st.nextToken();
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-apply_confirmed.htm");
if (getFort().getFunction(Fort.FUNC_RESTORE_HP) != null)
{
if (getFort().getFunction(Fort.FUNC_RESTORE_HP).getLvl() == Integer.parseInt(val))
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-used.htm");
html.replace("%val%", String.valueOf(val) + "%");
sendHtmlMessage(player, html);
return;
}
}
int percent = Integer.parseInt(val);
switch (percent)
{
case 0:
fee = 0;
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-cancel_confirmed.htm");
break;
case 300:
fee = Config.FS_HPREG1_FEE;
break;
default: // 400
fee = Config.FS_HPREG2_FEE;
break;
}
if (!getFort().updateFunctions(player, Fort.FUNC_RESTORE_HP, percent, fee, Config.FS_HPREG_FEE_RATIO, (getFort().getFunction(Fort.FUNC_RESTORE_HP) == null)))
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/low_adena.htm");
sendHtmlMessage(player, html);
}
sendHtmlMessage(player, html);
}
return;
}
else if (val.equalsIgnoreCase("mp"))
{
if (st.countTokens() >= 1)
{
int fee;
if (Config.DEBUG)
{
_log.warning("Mp editing invoked");
}
val = st.nextToken();
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-apply_confirmed.htm");
if (getFort().getFunction(Fort.FUNC_RESTORE_MP) != null)
{
if (getFort().getFunction(Fort.FUNC_RESTORE_MP).getLvl() == Integer.parseInt(val))
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-used.htm");
html.replace("%val%", String.valueOf(val) + "%");
sendHtmlMessage(player, html);
return;
}
}
int percent = Integer.parseInt(val);
switch (percent)
{
case 0:
fee = 0;
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-cancel_confirmed.htm");
break;
case 40:
fee = Config.FS_MPREG1_FEE;
break;
default: // 50
fee = Config.FS_MPREG2_FEE;
break;
}
if (!getFort().updateFunctions(player, Fort.FUNC_RESTORE_MP, percent, fee, Config.FS_MPREG_FEE_RATIO, (getFort().getFunction(Fort.FUNC_RESTORE_MP) == null)))
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/low_adena.htm");
sendHtmlMessage(player, html);
}
sendHtmlMessage(player, html);
}
return;
}
else if (val.equalsIgnoreCase("exp"))
{
if (st.countTokens() >= 1)
{
int fee;
if (Config.DEBUG)
{
_log.warning("Exp editing invoked");
}
val = st.nextToken();
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-apply_confirmed.htm");
if (getFort().getFunction(Fort.FUNC_RESTORE_EXP) != null)
{
if (getFort().getFunction(Fort.FUNC_RESTORE_EXP).getLvl() == Integer.parseInt(val))
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-used.htm");
html.replace("%val%", String.valueOf(val) + "%");
sendHtmlMessage(player, html);
return;
}
}
int percent = Integer.parseInt(val);
switch (percent)
{
case 0:
fee = 0;
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-cancel_confirmed.htm");
break;
case 45:
fee = Config.FS_EXPREG1_FEE;
break;
default: // 50
fee = Config.FS_EXPREG2_FEE;
break;
}
if (!getFort().updateFunctions(player, Fort.FUNC_RESTORE_EXP, percent, fee, Config.FS_EXPREG_FEE_RATIO, (getFort().getFunction(Fort.FUNC_RESTORE_EXP) == null)))
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/low_adena.htm");
sendHtmlMessage(player, html);
}
sendHtmlMessage(player, html);
}
return;
}
}
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/edit_recovery.htm");
String hp = "[<a action=\"bypass -h npc_%objectId%_manage recovery edit_hp 300\">300%</a>][<a action=\"bypass -h npc_%objectId%_manage recovery edit_hp 400\">400%</a>]";
String exp = "[<a action=\"bypass -h npc_%objectId%_manage recovery edit_exp 45\">45%</a>][<a action=\"bypass -h npc_%objectId%_manage recovery edit_exp 50\">50%</a>]";
String mp = "[<a action=\"bypass -h npc_%objectId%_manage recovery edit_mp 40\">40%</a>][<a action=\"bypass -h npc_%objectId%_manage recovery edit_mp 50\">50%</a>]";
if (getFort().getFunction(Fort.FUNC_RESTORE_HP) != null)
{
html.replace("%hp_recovery%", String.valueOf(getFort().getFunction(Fort.FUNC_RESTORE_HP).getLvl()) + "%</font> (<font color=\"FFAABB\">" + String.valueOf(getFort().getFunction(Fort.FUNC_RESTORE_HP).getLease()) + "</font>Adena /" + String.valueOf(Config.FS_HPREG_FEE_RATIO / 1000 / 60 / 60 / 24) + " Day)");
html.replace("%hp_period%", "Withdraw the fee for the next time at " + format.format(getFort().getFunction(Fort.FUNC_RESTORE_HP).getEndTime()));
html.replace("%change_hp%", "[<a action=\"bypass -h npc_%objectId%_manage recovery hp_cancel\">Deactivate</a>]" + hp);
}
else
{
html.replace("%hp_recovery%", "none");
html.replace("%hp_period%", "none");
html.replace("%change_hp%", hp);
}
if (getFort().getFunction(Fort.FUNC_RESTORE_EXP) != null)
{
html.replace("%exp_recovery%", String.valueOf(getFort().getFunction(Fort.FUNC_RESTORE_EXP).getLvl()) + "%</font> (<font color=\"FFAABB\">" + String.valueOf(getFort().getFunction(Fort.FUNC_RESTORE_EXP).getLease()) + "</font>Adena /" + String.valueOf(Config.FS_EXPREG_FEE_RATIO / 1000 / 60 / 60 / 24) + " Day)");
html.replace("%exp_period%", "Withdraw the fee for the next time at " + format.format(getFort().getFunction(Fort.FUNC_RESTORE_EXP).getEndTime()));
html.replace("%change_exp%", "[<a action=\"bypass -h npc_%objectId%_manage recovery exp_cancel\">Deactivate</a>]" + exp);
}
else
{
html.replace("%exp_recovery%", "none");
html.replace("%exp_period%", "none");
html.replace("%change_exp%", exp);
}
if (getFort().getFunction(Fort.FUNC_RESTORE_MP) != null)
{
html.replace("%mp_recovery%", String.valueOf(getFort().getFunction(Fort.FUNC_RESTORE_MP).getLvl()) + "%</font> (<font color=\"FFAABB\">" + String.valueOf(getFort().getFunction(Fort.FUNC_RESTORE_MP).getLease()) + "</font>Adena /" + String.valueOf(Config.FS_MPREG_FEE_RATIO / 1000 / 60 / 60 / 24) + " Day)");
html.replace("%mp_period%", "Withdraw the fee for the next time at " + format.format(getFort().getFunction(Fort.FUNC_RESTORE_MP).getEndTime()));
html.replace("%change_mp%", "[<a action=\"bypass -h npc_%objectId%_manage recovery mp_cancel\">Deactivate</a>]" + mp);
}
else
{
html.replace("%mp_recovery%", "none");
html.replace("%mp_period%", "none");
html.replace("%change_mp%", mp);
}
sendHtmlMessage(player, html);
}
else if (val.equalsIgnoreCase("other"))
{
if (st.countTokens() >= 1)
{
if (getFort().getOwnerClan() == null)
{
player.sendMessage("This fortress has no owner, you cannot change the configuration.");
return;
}
val = st.nextToken();
if (val.equalsIgnoreCase("tele_cancel"))
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-cancel.htm");
html.replace("%apply%", "other tele 0");
sendHtmlMessage(player, html);
return;
}
else if (val.equalsIgnoreCase("support_cancel"))
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-cancel.htm");
html.replace("%apply%", "other support 0");
sendHtmlMessage(player, html);
return;
}
else if (val.equalsIgnoreCase("edit_support"))
{
val = st.nextToken();
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-apply.htm");
html.replace("%name%", "Insignia (Supplementary Magic)");
int stage = Integer.parseInt(val);
int cost;
switch (stage)
{
case 1:
cost = Config.FS_SUPPORT1_FEE;
break;
default:
cost = Config.FS_SUPPORT2_FEE;
break;
}
html.replace("%cost%", String.valueOf(cost) + "</font>Adena /" + String.valueOf(Config.FS_SUPPORT_FEE_RATIO / 1000 / 60 / 60 / 24) + " Day</font>)");
html.replace("%use%", "Enables the use of supplementary magic.");
html.replace("%apply%", "other support " + String.valueOf(stage));
sendHtmlMessage(player, html);
return;
}
else if (val.equalsIgnoreCase("edit_tele"))
{
val = st.nextToken();
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-apply.htm");
html.replace("%name%", "Mirror (Teleportation Device)");
int stage = Integer.parseInt(val);
int cost;
switch (stage)
{
case 1:
cost = Config.FS_TELE1_FEE;
break;
default:
cost = Config.FS_TELE2_FEE;
break;
}
html.replace("%cost%", String.valueOf(cost) + "</font>Adena /" + String.valueOf(Config.FS_TELE_FEE_RATIO / 1000 / 60 / 60 / 24) + " Day</font>)");
html.replace("%use%", "Teleports clan members in a fort to the target <font color=\"00FFFF\">Stage " + String.valueOf(stage) + "</font> staging area");
html.replace("%apply%", "other tele " + String.valueOf(stage));
sendHtmlMessage(player, html);
return;
}
else if (val.equalsIgnoreCase("tele"))
{
if (st.countTokens() >= 1)
{
int fee;
if (Config.DEBUG)
{
_log.warning("Tele editing invoked");
}
val = st.nextToken();
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-apply_confirmed.htm");
if (getFort().getFunction(Fort.FUNC_TELEPORT) != null)
{
if (getFort().getFunction(Fort.FUNC_TELEPORT).getLvl() == Integer.parseInt(val))
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-used.htm");
html.replace("%val%", "Stage " + String.valueOf(val));
sendHtmlMessage(player, html);
return;
}
}
int lvl = Integer.parseInt(val);
switch (lvl)
{
case 0:
fee = 0;
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-cancel_confirmed.htm");
break;
case 1:
fee = Config.FS_TELE1_FEE;
break;
default:
fee = Config.FS_TELE2_FEE;
break;
}
if (!getFort().updateFunctions(player, Fort.FUNC_TELEPORT, lvl, fee, Config.FS_TELE_FEE_RATIO, (getFort().getFunction(Fort.FUNC_TELEPORT) == null)))
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/low_adena.htm");
sendHtmlMessage(player, html);
}
sendHtmlMessage(player, html);
}
return;
}
else if (val.equalsIgnoreCase("support"))
{
if (st.countTokens() >= 1)
{
int fee;
if (Config.DEBUG)
{
_log.warning("Support editing invoked");
}
val = st.nextToken();
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-apply_confirmed.htm");
if (getFort().getFunction(Fort.FUNC_SUPPORT) != null)
{
if (getFort().getFunction(Fort.FUNC_SUPPORT).getLvl() == Integer.parseInt(val))
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-used.htm");
html.replace("%val%", "Stage " + String.valueOf(val));
sendHtmlMessage(player, html);
return;
}
}
int lvl = Integer.parseInt(val);
switch (lvl)
{
case 0:
fee = 0;
html.setFile(player.getHtmlPrefix(), "data/html/fortress/functions-cancel_confirmed.htm");
break;
case 1:
fee = Config.FS_SUPPORT1_FEE;
break;
default:
fee = Config.FS_SUPPORT2_FEE;
break;
}
if (!getFort().updateFunctions(player, Fort.FUNC_SUPPORT, lvl, fee, Config.FS_SUPPORT_FEE_RATIO, (getFort().getFunction(Fort.FUNC_SUPPORT) == null)))
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/low_adena.htm");
sendHtmlMessage(player, html);
}
else
{
sendHtmlMessage(player, html);
}
}
return;
}
}
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/edit_other.htm");
String tele = "[<a action=\"bypass -h npc_%objectId%_manage other edit_tele 1\">Level 1</a>][<a action=\"bypass -h npc_%objectId%_manage other edit_tele 2\">Level 2</a>]";
String support = "[<a action=\"bypass -h npc_%objectId%_manage other edit_support 1\">Level 1</a>][<a action=\"bypass -h npc_%objectId%_manage other edit_support 2\">Level 2</a>]";
if (getFort().getFunction(Fort.FUNC_TELEPORT) != null)
{
html.replace("%tele%", "Stage " + String.valueOf(getFort().getFunction(Fort.FUNC_TELEPORT).getLvl()) + "</font> (<font color=\"FFAABB\">" + String.valueOf(getFort().getFunction(Fort.FUNC_TELEPORT).getLease()) + "</font>Adena /" + String.valueOf(Config.FS_TELE_FEE_RATIO / 1000 / 60 / 60 / 24) + " Day)");
html.replace("%tele_period%", "Withdraw the fee for the next time at " + format.format(getFort().getFunction(Fort.FUNC_TELEPORT).getEndTime()));
html.replace("%change_tele%", "[<a action=\"bypass -h npc_%objectId%_manage other tele_cancel\">Deactivate</a>]" + tele);
}
else
{
html.replace("%tele%", "none");
html.replace("%tele_period%", "none");
html.replace("%change_tele%", tele);
}
if (getFort().getFunction(Fort.FUNC_SUPPORT) != null)
{
html.replace("%support%", "Stage " + String.valueOf(getFort().getFunction(Fort.FUNC_SUPPORT).getLvl()) + "</font> (<font color=\"FFAABB\">" + String.valueOf(getFort().getFunction(Fort.FUNC_SUPPORT).getLease()) + "</font>Adena /" + String.valueOf(Config.FS_SUPPORT_FEE_RATIO / 1000 / 60 / 60 / 24) + " Day)");
html.replace("%support_period%", "Withdraw the fee for the next time at " + format.format(getFort().getFunction(Fort.FUNC_SUPPORT).getEndTime()));
html.replace("%change_support%", "[<a action=\"bypass -h npc_%objectId%_manage other support_cancel\">Deactivate</a>]" + support);
}
else
{
html.replace("%support%", "none");
html.replace("%support_period%", "none");
html.replace("%change_support%", support);
}
sendHtmlMessage(player, html);
}
else if (val.equalsIgnoreCase("back"))
{
showChatWindow(player);
}
else
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/manage.htm");
sendHtmlMessage(player, html);
}
}
else
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-noprivs.htm");
sendHtmlMessage(player, html);
}
return;
}
else if (actualCommand.equalsIgnoreCase("support"))
{
setTarget(player);
Skill skill;
if (val.isEmpty())
{
return;
}
try
{
int skill_id = Integer.parseInt(val);
try
{
if (getFort().getFunction(Fort.FUNC_SUPPORT) == null)
{
return;
}
if (getFort().getFunction(Fort.FUNC_SUPPORT).getLvl() == 0)
{
return;
}
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
int skill_lvl = 0;
if (st.countTokens() >= 1)
{
skill_lvl = Integer.parseInt(st.nextToken());
}
skill = SkillData.getInstance().getSkill(skill_id, skill_lvl);
if (skill.hasEffectType(L2EffectType.SUMMON))
{
player.doCast(skill);
}
else
{
if (!((skill.getMpConsume() + skill.getMpInitialConsume()) > getCurrentMp()))
{
this.doCast(skill);
}
else
{
html.setFile(player.getHtmlPrefix(), "data/html/fortress/support-no_mana.htm");
html.replace("%mp%", String.valueOf((int) getCurrentMp()));
sendHtmlMessage(player, html);
return;
}
}
html.setFile(player.getHtmlPrefix(), "data/html/fortress/support-done.htm");
html.replace("%mp%", String.valueOf((int) getCurrentMp()));
sendHtmlMessage(player, html);
}
catch (Exception e)
{
player.sendMessage("Invalid skill level, contact your admin!");
}
}
catch (Exception e)
{
player.sendMessage("Invalid skill level, contact your admin!");
}
return;
}
else if (actualCommand.equalsIgnoreCase("support_back"))
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
if (getFort().getFunction(Fort.FUNC_SUPPORT).getLvl() == 0)
{
return;
}
html.setFile(player.getHtmlPrefix(), "data/html/fortress/support" + getFort().getFunction(Fort.FUNC_SUPPORT).getLvl() + ".htm");
html.replace("%mp%", String.valueOf((int) getStatus().getCurrentMp()));
sendHtmlMessage(player, html);
return;
}
else if (actualCommand.equalsIgnoreCase("goto"))
{
int whereTo = Integer.parseInt(val);
doTeleport(player, whereTo);
return;
}
super.onBypassFeedback(player, command);
}
}
@Override
public void showChatWindow(L2PcInstance player)
{
player.sendPacket(ActionFailed.STATIC_PACKET);
String filename = "data/html/fortress/foreman-no.htm";
int condition = validateCondition(player);
if (condition > COND_ALL_FALSE)
{
if (condition == COND_BUSY_BECAUSE_OF_SIEGE)
{
filename = "data/html/fortress/foreman-busy.htm"; // Busy because of siege
}
else if (condition == COND_OWNER)
{
filename = "data/html/fortress/foreman.htm"; // Owner message window
}
}
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), filename);
html.replace("%objectId%", String.valueOf(getObjectId()));
html.replace("%npcname%", getName());
player.sendPacket(html);
}
private void doTeleport(L2PcInstance player, int val)
{
if (Config.DEBUG)
{
_log.warning("doTeleport(L2PcInstance player, int val) is called");
}
L2TeleportLocation list = TeleportLocationTable.getInstance().getTemplate(val);
if (list != null)
{
if (player.destroyItemByItemId("Teleport", list.getItemId(), list.getPrice(), this, true))
{
if (Config.DEBUG)
{
_log.warning("Teleporting player " + player.getName() + " for Fortress to new location: " + list.getLocX() + ":" + list.getLocY() + ":" + list.getLocZ());
}
player.teleToLocation(list.getLocX(), list.getLocY(), list.getLocZ());
}
}
else
{
_log.warning("No teleport destination with id:" + val);
}
player.sendPacket(ActionFailed.STATIC_PACKET);
}
protected int validateCondition(L2PcInstance player)
{
if ((getFort() != null) && (getFort().getResidenceId() > 0))
{
if (player.getClan() != null)
{
if (getFort().getZone().isActive())
{
return COND_BUSY_BECAUSE_OF_SIEGE; // Busy because of siege
}
else if ((getFort().getOwnerClan() != null) && (getFort().getOwnerClan().getId() == player.getClanId()))
{
return COND_OWNER; // Owner
}
}
}
return COND_ALL_FALSE;
}
private void showVaultWindowDeposit(L2PcInstance player)
{
player.sendPacket(ActionFailed.STATIC_PACKET);
player.setActiveWarehouse(player.getClan().getWarehouse());
player.sendPacket(new WareHouseDepositList(player, WareHouseDepositList.CLAN));
}
private void showVaultWindowWithdraw(L2PcInstance player, WarehouseListType itemtype, byte sortorder)
{
if (player.isClanLeader() || player.hasClanPrivilege(ClanPrivilege.CL_VIEW_WAREHOUSE))
{
player.sendPacket(ActionFailed.STATIC_PACKET);
player.setActiveWarehouse(player.getClan().getWarehouse());
if (itemtype != null)
{
player.sendPacket(new SortedWareHouseWithdrawalList(player, WareHouseWithdrawalList.CLAN, itemtype, sortorder));
}
else
{
player.sendPacket(new WareHouseWithdrawalList(player, WareHouseWithdrawalList.CLAN));
}
}
else
{
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile(player.getHtmlPrefix(), "data/html/fortress/foreman-noprivs.htm");
sendHtmlMessage(player, html);
}
}
}