/*
* Copyright (C) 2004-2015 L2J DataPack
*
* This file is part of L2J DataPack.
*
* L2J DataPack 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 DataPack 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 .
*/
package ai.npc.Trainers.HealerTrainer;
import java.util.Collection;
import ai.npc.AbstractNpcAI;
import com.l2jserver.Config;
import com.l2jserver.gameserver.data.xml.impl.SkillTreesData;
import com.l2jserver.gameserver.datatables.SkillData;
import com.l2jserver.gameserver.model.L2SkillLearn;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.base.AcquireSkillType;
import com.l2jserver.gameserver.model.holders.ItemHolder;
import com.l2jserver.gameserver.model.skills.Skill;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList;
/**
* Trainer healers AI.
* @author Zoey76
*/
public final class HealerTrainer extends AbstractNpcAI
{
// NPC
// @formatter:off
private static final int[] HEALER_TRAINERS =
{
30022, 30030, 30032, 30036, 30067, 30068, 30116, 30117, 30118, 30119,
30144, 30145, 30188, 30194, 30293, 30330, 30375, 30377, 30464, 30473,
30476, 30680, 30701, 30720, 30721, 30858, 30859, 30860, 30861, 30864,
30906, 30908, 30912, 31280, 31281, 31287, 31329, 31330, 31335, 31969,
31970, 31976, 32155, 32162
};
// @formatter:on
// Misc
private static final int MIN_LEVEL = 76;
private static final int MIN_CLASS_LEVEL = 3;
private HealerTrainer()
{
super(HealerTrainer.class.getSimpleName(), "ai/npc/Trainers");
addStartNpc(HEALER_TRAINERS);
addTalkId(HEALER_TRAINERS);
addFirstTalkId(HEALER_TRAINERS);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
String htmltext = null;
switch (event)
{
case "30864.html":
case "30864-1.html":
{
htmltext = event;
break;
}
case "SkillTransfer":
{
htmltext = "main.html";
break;
}
case "SkillTransferLearn":
{
if (!npc.getTemplate().canTeach(player.getClassId()))
{
htmltext = npc.getId() + "-noteach.html";
break;
}
if ((player.getLevel() < MIN_LEVEL) || (player.getClassId().level() < MIN_CLASS_LEVEL))
{
htmltext = "learn-lowlevel.html";
break;
}
final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.TRANSFER);
int count = 0;
for (L2SkillLearn skillLearn : SkillTreesData.getInstance().getAvailableTransferSkills(player))
{
if (SkillData.getInstance().getSkill(skillLearn.getSkillId(), skillLearn.getSkillLevel()) != null)
{
count++;
asl.addSkill(skillLearn.getSkillId(), skillLearn.getSkillLevel(), skillLearn.getSkillLevel(), skillLearn.getLevelUpSp(), 0);
}
}
if (count > 0)
{
player.sendPacket(asl);
}
else
{
player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN);
}
break;
}
case "SkillTransferCleanse":
{
if (!npc.getTemplate().canTeach(player.getClassId()))
{
htmltext = "cleanse-no.html";
break;
}
if ((player.getLevel() < MIN_LEVEL) || (player.getClassId().level() < MIN_CLASS_LEVEL))
{
htmltext = "cleanse-no.html";
break;
}
if (player.getAdena() < Config.FEE_DELETE_TRANSFER_SKILLS)
{
player.sendPacket(SystemMessageId.CANNOT_RESET_SKILL_LINK_BECAUSE_NOT_ENOUGH_ADENA);
break;
}
if (hasTransferSkillItems(player))
{
// Come back when you have used all transfer skill items for this class.
htmltext = "cleanse-no_skills.html";
}
else
{
boolean hasSkills = false;
final Collection skills = SkillTreesData.getInstance().getTransferSkillTree(player.getClassId()).values();
for (L2SkillLearn skillLearn : skills)
{
final Skill skill = player.getKnownSkill(skillLearn.getSkillId());
if (skill != null)
{
player.removeSkill(skill);
for (ItemHolder item : skillLearn.getRequiredItems())
{
player.addItem("Cleanse", item.getId(), item.getCount(), npc, true);
}
hasSkills = true;
}
}
// Adena gets reduced once.
if (hasSkills)
{
player.reduceAdena("Cleanse", Config.FEE_DELETE_TRANSFER_SKILLS, npc, true);
}
}
break;
}
}
return htmltext;
}
/**
* Verify if the player has the required item.
* @param player the player to verify
* @return {@code true} if the player has the item for the current class, {@code false} otherwise
*/
private static boolean hasTransferSkillItems(L2PcInstance player)
{
int itemId;
switch (player.getClassId())
{
case cardinal:
{
itemId = 15307;
break;
}
case evaSaint:
{
itemId = 15308;
break;
}
case shillienSaint:
{
itemId = 15309;
break;
}
default:
{
itemId = -1;
}
}
return (player.getInventory().getInventoryItemCount(itemId, -1) > 0);
}
public static void main(String[] args)
{
new HealerTrainer();
}
}