/*
* 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.util.List;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import com.l2jserver.Config;
import com.l2jserver.gameserver.data.sql.impl.ClanTable;
import com.l2jserver.gameserver.data.xml.impl.SkillTreesData;
import com.l2jserver.gameserver.enums.InstanceType;
import com.l2jserver.gameserver.instancemanager.CastleManager;
import com.l2jserver.gameserver.instancemanager.FortManager;
import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
import com.l2jserver.gameserver.instancemanager.SiegeManager;
import com.l2jserver.gameserver.model.L2Clan;
import com.l2jserver.gameserver.model.L2Clan.SubPledge;
import com.l2jserver.gameserver.model.L2ClanMember;
import com.l2jserver.gameserver.model.L2SkillLearn;
import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
import com.l2jserver.gameserver.model.base.AcquireSkillType;
import com.l2jserver.gameserver.model.base.PlayerClass;
import com.l2jserver.gameserver.model.entity.Castle;
import com.l2jserver.gameserver.model.entity.Fort;
import com.l2jserver.gameserver.model.zone.ZoneId;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
import com.l2jserver.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import com.l2jserver.gameserver.network.serverpackets.MagicSkillLaunched;
import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
import com.l2jserver.gameserver.network.serverpackets.UserInfo;
import com.l2jserver.gameserver.util.Util;
/**
* This class ...
* @version $Revision: 1.4.2.3.2.8 $ $Date: 2005/03/29 23:15:15 $
*/
public class L2VillageMasterInstance extends L2NpcInstance
{
private static Logger _log = Logger.getLogger(L2VillageMasterInstance.class.getName());
/**
* Creates a village master.
* @param template the village master NPC template
*/
public L2VillageMasterInstance(L2NpcTemplate template)
{
super(template);
setInstanceType(InstanceType.L2VillageMasterInstance);
}
@Override
public String getHtmlPath(int npcId, int val)
{
String pom = "";
if (val == 0)
{
pom = "" + npcId;
}
else
{
pom = npcId + "-" + val;
}
return "data/html/villagemaster/" + pom + ".htm";
}
@Override
public void onBypassFeedback(L2PcInstance player, String command)
{
String[] commandStr = command.split(" ");
String actualCommand = commandStr[0]; // Get actual command
String cmdParams = "";
String cmdParams2 = "";
if (commandStr.length >= 2)
{
cmdParams = commandStr[1];
}
if (commandStr.length >= 3)
{
cmdParams2 = commandStr[2];
}
if (actualCommand.equalsIgnoreCase("create_clan"))
{
if (cmdParams.isEmpty())
{
return;
}
if (!isValidName(cmdParams))
{
player.sendPacket(SystemMessageId.CLAN_NAME_IS_INVALID);
return;
}
ClanTable.getInstance().createClan(player, cmdParams);
}
else if (actualCommand.equalsIgnoreCase("create_academy"))
{
if (cmdParams.isEmpty())
{
return;
}
createSubPledge(player, cmdParams, null, L2Clan.SUBUNIT_ACADEMY, 5);
}
else if (actualCommand.equalsIgnoreCase("rename_pledge"))
{
if (cmdParams.isEmpty() || cmdParams2.isEmpty())
{
return;
}
renameSubPledge(player, Integer.parseInt(cmdParams), cmdParams2);
}
else if (actualCommand.equalsIgnoreCase("create_royal"))
{
if (cmdParams.isEmpty())
{
return;
}
createSubPledge(player, cmdParams, cmdParams2, L2Clan.SUBUNIT_ROYAL1, 6);
}
else if (actualCommand.equalsIgnoreCase("create_knight"))
{
if (cmdParams.isEmpty())
{
return;
}
createSubPledge(player, cmdParams, cmdParams2, L2Clan.SUBUNIT_KNIGHT1, 7);
}
else if (actualCommand.equalsIgnoreCase("assign_subpl_leader"))
{
if (cmdParams.isEmpty())
{
return;
}
assignSubPledgeLeader(player, cmdParams, cmdParams2);
}
else if (actualCommand.equalsIgnoreCase("create_ally"))
{
if (cmdParams.isEmpty())
{
return;
}
if (player.getClan() == null)
{
player.sendPacket(SystemMessageId.ONLY_CLAN_LEADERS_MAY_CREATE_ALLIANCES);
}
else
{
player.getClan().createAlly(player, cmdParams);
}
}
else if (actualCommand.equalsIgnoreCase("dissolve_ally"))
{
player.getClan().dissolveAlly(player);
}
else if (actualCommand.equalsIgnoreCase("dissolve_clan"))
{
dissolveClan(player, player.getClanId());
}
else if (actualCommand.equalsIgnoreCase("change_clan_leader"))
{
if (cmdParams.isEmpty())
{
return;
}
if (!player.isClanLeader())
{
player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
return;
}
if (player.getName().equalsIgnoreCase(cmdParams))
{
return;
}
final L2Clan clan = player.getClan();
final L2ClanMember member = clan.getClanMember(cmdParams);
if (member == null)
{
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DOES_NOT_EXIST);
sm.addString(cmdParams);
player.sendPacket(sm);
return;
}
if (!member.isOnline())
{
player.sendPacket(SystemMessageId.THAT_PLAYER_IS_NOT_CURRENTLY_ONLINE);
return;
}
// To avoid clans with null clan leader, academy members shouldn't be eligible for clan leader.
if (member.getPlayerInstance().isAcademyMember())
{
player.sendPacket(SystemMessageId.THAT_PRIVILEGE_CANNOT_BE_GRANTED_TO_A_CLAN_ACADEMY_MEMBER);
return;
}
if (Config.ALT_CLAN_LEADER_INSTANT_ACTIVATION)
{
clan.setNewLeader(member);
}
else
{
final NpcHtmlMessage msg = new NpcHtmlMessage(getObjectId());
if (clan.getNewLeaderId() == 0)
{
clan.setNewLeaderId(member.getObjectId(), true);
msg.setFile(player.getHtmlPrefix(), "data/scripts/village_master/Clan/9000-07-success.htm");
}
else
{
msg.setFile(player.getHtmlPrefix(), "data/scripts/village_master/Clan/9000-07-in-progress.htm");
}
player.sendPacket(msg);
}
}
else if (actualCommand.equalsIgnoreCase("cancel_clan_leader_change"))
{
if (!player.isClanLeader())
{
player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
return;
}
final L2Clan clan = player.getClan();
final NpcHtmlMessage msg = new NpcHtmlMessage(getObjectId());
if (clan.getNewLeaderId() != 0)
{
clan.setNewLeaderId(0, true);
msg.setFile(player.getHtmlPrefix(), "data/scripts/village_master/Clan/9000-07-canceled.htm");
}
else
{
msg.setHtml("<html><body>You don't have clan leader delegation applications submitted yet!</body></html>");
}
player.sendPacket(msg);
}
else if (actualCommand.equalsIgnoreCase("recover_clan"))
{
recoverClan(player, player.getClanId());
}
else if (actualCommand.equalsIgnoreCase("increase_clan_level"))
{
if (player.getClan().levelUpClan(player))
{
player.broadcastPacket(new MagicSkillUse(player, 5103, 1, 0, 0));
player.broadcastPacket(new MagicSkillLaunched(player, 5103, 1));
}
}
else if (actualCommand.equalsIgnoreCase("learn_clan_skills"))
{
showPledgeSkillList(player);
}
else
{
super.onBypassFeedback(player, command);
}
}
protected boolean checkVillageMasterRace(PlayerClass pclass)
{
return true;
}
protected boolean checkVillageMasterTeachType(PlayerClass pclass)
{
return true;
}
/**
* Returns true if this classId allowed for master
* @param classId
* @return
*/
public final boolean checkVillageMaster(int classId)
{
return checkVillageMaster(PlayerClass.values()[classId]);
}
/**
* Returns true if this PlayerClass is allowed for master
* @param pclass
* @return
*/
public final boolean checkVillageMaster(PlayerClass pclass)
{
return checkVillageMasterRace(pclass) && checkVillageMasterTeachType(pclass);
}
private static final void dissolveClan(L2PcInstance player, int clanId)
{
if (!player.isClanLeader())
{
player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
return;
}
final L2Clan clan = player.getClan();
if (clan.getAllyId() != 0)
{
player.sendPacket(SystemMessageId.YOU_CANNOT_DISPERSE_THE_CLANS_IN_YOUR_ALLIANCE);
return;
}
if (clan.isAtWar())
{
player.sendPacket(SystemMessageId.YOU_CANNOT_DISSOLVE_A_CLAN_WHILE_ENGAGED_IN_A_WAR);
return;
}
if ((clan.getCastleId() != 0) || (clan.getHideoutId() != 0) || (clan.getFortId() != 0))
{
player.sendPacket(SystemMessageId.YOU_CANNOT_DISSOLVE_A_CLAN_WHILE_OWNING_A_CLAN_HALL_OR_CASTLE);
return;
}
for (Castle castle : CastleManager.getInstance().getCastles())
{
if (SiegeManager.getInstance().checkIsRegistered(clan, castle.getResidenceId()))
{
player.sendPacket(SystemMessageId.YOU_CANNOT_DISSOLVE_A_CLAN_DURING_A_SIEGE_OR_WHILE_PROTECTING_A_CASTLE);
return;
}
}
for (Fort fort : FortManager.getInstance().getForts())
{
if (FortSiegeManager.getInstance().checkIsRegistered(clan, fort.getResidenceId()))
{
player.sendPacket(SystemMessageId.YOU_CANNOT_DISSOLVE_A_CLAN_DURING_A_SIEGE_OR_WHILE_PROTECTING_A_CASTLE);
return;
}
}
if (player.isInsideZone(ZoneId.SIEGE))
{
player.sendPacket(SystemMessageId.YOU_CANNOT_DISSOLVE_A_CLAN_DURING_A_SIEGE_OR_WHILE_PROTECTING_A_CASTLE);
return;
}
if (clan.getDissolvingExpiryTime() > System.currentTimeMillis())
{
player.sendPacket(SystemMessageId.YOU_HAVE_ALREADY_REQUESTED_THE_DISSOLUTION_OF_YOUR_CLAN);
return;
}
clan.setDissolvingExpiryTime(System.currentTimeMillis() + (Config.ALT_CLAN_DISSOLVE_DAYS * 86400000L)); // 24*60*60*1000 = 86400000
clan.updateClanInDB();
// The clan leader should take the XP penalty of a full death.
player.calculateDeathExpPenalty(null, false);
ClanTable.getInstance().scheduleRemoveClan(clan.getId());
}
private static final void recoverClan(L2PcInstance player, int clanId)
{
if (!player.isClanLeader())
{
player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
return;
}
final L2Clan clan = player.getClan();
clan.setDissolvingExpiryTime(0);
clan.updateClanInDB();
}
private static final void createSubPledge(L2PcInstance player, String clanName, String leaderName, int pledgeType, int minClanLvl)
{
if (!player.isClanLeader())
{
player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
return;
}
final L2Clan clan = player.getClan();
if (clan.getLevel() < minClanLvl)
{
if (pledgeType == L2Clan.SUBUNIT_ACADEMY)
{
player.sendPacket(SystemMessageId.TO_ESTABLISH_A_CLAN_ACADEMY_YOUR_CLAN_MUST_BE_LEVEL_5_OR_HIGHER);
}
else
{
player.sendPacket(SystemMessageId.THE_CONDITIONS_NECESSARY_TO_CREATE_A_MILITARY_UNIT_HAVE_NOT_BEEN_MET);
}
return;
}
if (!Util.isAlphaNumeric(clanName) || !isValidName(clanName) || (2 > clanName.length()))
{
player.sendPacket(SystemMessageId.CLAN_NAME_IS_INVALID);
return;
}
if (clanName.length() > 16)
{
player.sendPacket(SystemMessageId.CLAN_NAME_S_LENGTH_IS_INCORRECT);
return;
}
for (L2Clan tempClan : ClanTable.getInstance().getClans())
{
if (tempClan.getSubPledge(clanName) != null)
{
if (pledgeType == L2Clan.SUBUNIT_ACADEMY)
{
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_ALREADY_EXISTS);
sm.addString(clanName);
player.sendPacket(sm);
}
else
{
player.sendPacket(SystemMessageId.ANOTHER_MILITARY_UNIT_IS_ALREADY_USING_THAT_NAME_PLEASE_ENTER_A_DIFFERENT_NAME);
}
return;
}
}
if (pledgeType != L2Clan.SUBUNIT_ACADEMY)
{
if ((clan.getClanMember(leaderName) == null) || (clan.getClanMember(leaderName).getPledgeType() != 0))
{
if (pledgeType >= L2Clan.SUBUNIT_KNIGHT1)
{
player.sendPacket(SystemMessageId.THE_CAPTAIN_OF_THE_ORDER_OF_KNIGHTS_CANNOT_BE_APPOINTED);
}
else if (pledgeType >= L2Clan.SUBUNIT_ROYAL1)
{
player.sendPacket(SystemMessageId.THE_ROYAL_GUARD_CAPTAIN_CANNOT_BE_APPOINTED);
}
return;
}
}
final int leaderId = pledgeType != L2Clan.SUBUNIT_ACADEMY ? clan.getClanMember(leaderName).getObjectId() : 0;
if (clan.createSubPledge(player, pledgeType, leaderId, clanName) == null)
{
return;
}
SystemMessage sm;
if (pledgeType == L2Clan.SUBUNIT_ACADEMY)
{
sm = SystemMessage.getSystemMessage(SystemMessageId.CONGRATULATIONS_THE_S1_S_CLAN_ACADEMY_HAS_BEEN_CREATED);
sm.addString(player.getClan().getName());
}
else if (pledgeType >= L2Clan.SUBUNIT_KNIGHT1)
{
sm = SystemMessage.getSystemMessage(SystemMessageId.THE_KNIGHTS_OF_S1_HAVE_BEEN_CREATED);
sm.addString(player.getClan().getName());
}
else if (pledgeType >= L2Clan.SUBUNIT_ROYAL1)
{
sm = SystemMessage.getSystemMessage(SystemMessageId.THE_ROYAL_GUARD_OF_S1_HAVE_BEEN_CREATED);
sm.addString(player.getClan().getName());
}
else
{
sm = SystemMessage.getSystemMessage(SystemMessageId.YOUR_CLAN_HAS_BEEN_CREATED);
}
player.sendPacket(sm);
if (pledgeType != L2Clan.SUBUNIT_ACADEMY)
{
final L2ClanMember leaderSubPledge = clan.getClanMember(leaderName);
final L2PcInstance leaderPlayer = leaderSubPledge.getPlayerInstance();
if (leaderPlayer != null)
{
leaderPlayer.setPledgeClass(L2ClanMember.calculatePledgeClass(leaderPlayer));
leaderPlayer.sendPacket(new UserInfo(leaderPlayer));
}
}
}
private static final void renameSubPledge(L2PcInstance player, int pledgeType, String pledgeName)
{
if (!player.isClanLeader())
{
player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
return;
}
final L2Clan clan = player.getClan();
final SubPledge subPledge = player.getClan().getSubPledge(pledgeType);
if (subPledge == null)
{
player.sendMessage("Pledge don't exists.");
return;
}
if (!Util.isAlphaNumeric(pledgeName) || !isValidName(pledgeName) || (2 > pledgeName.length()))
{
player.sendPacket(SystemMessageId.CLAN_NAME_IS_INVALID);
return;
}
if (pledgeName.length() > 16)
{
player.sendPacket(SystemMessageId.CLAN_NAME_S_LENGTH_IS_INCORRECT);
return;
}
subPledge.setName(pledgeName);
clan.updateSubPledgeInDB(subPledge.getId());
clan.broadcastClanStatus();
player.sendMessage("Pledge name changed.");
}
private static final void assignSubPledgeLeader(L2PcInstance player, String clanName, String leaderName)
{
if (!player.isClanLeader())
{
player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);
return;
}
if (leaderName.length() > 16)
{
player.sendPacket(SystemMessageId.YOUR_TITLE_CANNOT_EXCEED_16_CHARACTERS_IN_LENGTH_PLEASE_TRY_AGAIN);
return;
}
if (player.getName().equals(leaderName))
{
player.sendPacket(SystemMessageId.THE_ROYAL_GUARD_CAPTAIN_CANNOT_BE_APPOINTED);
return;
}
final L2Clan clan = player.getClan();
final SubPledge subPledge = player.getClan().getSubPledge(clanName);
if ((null == subPledge) || (subPledge.getId() == L2Clan.SUBUNIT_ACADEMY))
{
player.sendPacket(SystemMessageId.CLAN_NAME_IS_INVALID);
return;
}
if ((clan.getClanMember(leaderName) == null) || (clan.getClanMember(leaderName).getPledgeType() != 0))
{
if (subPledge.getId() >= L2Clan.SUBUNIT_KNIGHT1)
{
player.sendPacket(SystemMessageId.THE_CAPTAIN_OF_THE_ORDER_OF_KNIGHTS_CANNOT_BE_APPOINTED);
}
else if (subPledge.getId() >= L2Clan.SUBUNIT_ROYAL1)
{
player.sendPacket(SystemMessageId.THE_ROYAL_GUARD_CAPTAIN_CANNOT_BE_APPOINTED);
}
return;
}
subPledge.setLeaderId(clan.getClanMember(leaderName).getObjectId());
clan.updateSubPledgeInDB(subPledge.getId());
final L2ClanMember leaderSubPledge = clan.getClanMember(leaderName);
final L2PcInstance leaderPlayer = leaderSubPledge.getPlayerInstance();
if (leaderPlayer != null)
{
leaderPlayer.setPledgeClass(L2ClanMember.calculatePledgeClass(leaderPlayer));
leaderPlayer.sendPacket(new UserInfo(leaderPlayer));
}
clan.broadcastClanStatus();
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_BEEN_SELECTED_AS_THE_CAPTAIN_OF_S2);
sm.addString(leaderName);
sm.addString(clanName);
clan.broadcastToOnlineMembers(sm);
}
/**
* this displays PledgeSkillList to the player.
* @param player
*/
public static final void showPledgeSkillList(L2PcInstance player)
{
if (!player.isClanLeader())
{
final NpcHtmlMessage html = new NpcHtmlMessage();
html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/NotClanLeader.htm");
player.sendPacket(html);
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
final List<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailablePledgeSkills(player.getClan());
if (skills.isEmpty())
{
if (player.getClan().getLevel() < 8)
{
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_DO_NOT_HAVE_ANY_FURTHER_SKILLS_TO_LEARN_COME_BACK_WHEN_YOU_HAVE_REACHED_LEVEL_S1);
if (player.getClan().getLevel() < 5)
{
sm.addInt(5);
}
else
{
sm.addInt(player.getClan().getLevel() + 1);
}
player.sendPacket(sm);
}
else
{
final NpcHtmlMessage html = new NpcHtmlMessage();
html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/NoMoreSkills.htm");
player.sendPacket(html);
}
}
else
{
player.sendPacket(new ExAcquirableSkillListByClass(skills, AcquireSkillType.PLEDGE));
}
player.sendPacket(ActionFailed.STATIC_PACKET);
}
private static boolean isValidName(String name)
{
Pattern pattern;
try
{
pattern = Pattern.compile(Config.CLAN_NAME_TEMPLATE);
}
catch (PatternSyntaxException e)
{
_log.warning("ERROR: Wrong pattern for clan name!");
pattern = Pattern.compile(".*");
}
return pattern.matcher(name).matches();
}
}