/*
* 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 com.l2jserver.gameserver.model.actor.instance;
import javolution.util.FastList;
import javolution.util.FastMap;
import com.l2jserver.Config;
import com.l2jserver.gameserver.datatables.SkillTable;
import com.l2jserver.gameserver.datatables.SkillTreesData;
import com.l2jserver.gameserver.model.L2Effect;
import com.l2jserver.gameserver.model.L2Skill;
import com.l2jserver.gameserver.model.L2SkillLearn;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.status.FolkStatus;
import com.l2jserver.gameserver.model.base.ClassId;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList;
import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList.SkillType;
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
import com.l2jserver.gameserver.skills.effects.EffectBuff;
import com.l2jserver.gameserver.skills.effects.EffectDebuff;
import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
import com.l2jserver.util.StringUtil;
public class L2NpcInstance extends L2Npc
{
private final ClassId[] _classesToTeach;
public L2NpcInstance(int objectId, L2NpcTemplate template)
{
super(objectId, template);
setInstanceType(InstanceType.L2NpcInstance);
setIsInvul(false);
_classesToTeach = template.getTeachInfo();
}
@Override
public FolkStatus getStatus()
{
return (FolkStatus)super.getStatus();
}
@Override
public void initCharStatus()
{
setStatus(new FolkStatus(this));
}
@Override
public void addEffect(L2Effect newEffect)
{
if (newEffect instanceof EffectDebuff || newEffect instanceof EffectBuff)
super.addEffect(newEffect);
else if (newEffect != null)
newEffect.stopEffectTask();
}
public ClassId[] getClassesToTeach()
{
return _classesToTeach;
}
/**
* Displays Skill Tree for a given player, npc and class Id.
* @param player the active character.
* @param npc the last folk.
* @param classId player's active class id.
*/
public static void showSkillList(L2PcInstance player, L2Npc npc, ClassId classId)
{
if (Config.DEBUG)
{
_log.fine("SkillList activated on: "+npc.getObjectId());
}
final int npcId = npc.getTemplate().npcId;
if (npcId == 32611) //Tolonis (Officer)
{
final FastList<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableCollectSkills(player);
final AcquireSkillList asl = new AcquireSkillList(SkillType.Collect);
int counts = 0;
for (L2SkillLearn s : skills)
{
final L2Skill sk = SkillTable.getInstance().getInfo(s.getSkillId(), s.getSkillLevel());
if (sk != null)
{
counts++;
asl.addSkill(s.getSkillId(), s.getSkillLevel(), s.getSkillLevel(), 0, 1);
}
}
if (counts == 0) // No more skills to learn, come back when you level.
{
final int minLevel = SkillTreesData.getInstance().getMinLevelForNewSkill(player, SkillTreesData.getInstance().getCollectSkillTree());
if (minLevel > 0)
{
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1);
sm.addNumber(minLevel);
player.sendPacket(sm);
}
else
{
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.NO_MORE_SKILLS_TO_LEARN));
}
}
else
{
player.sendPacket(asl);
}
return;
}
if (!npc.getTemplate().canTeach(classId))
{
npc.showNoTeachHtml(player);
return;
}
if (((L2NpcInstance)npc).getClassesToTeach() == null)
{
NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
final String sb = StringUtil.concat(
"<html><body>" +
"I cannot teach you. My class list is empty.<br> Ask admin to fix it. Need add my npcid and classes to skill_learn.sql.<br>NpcId:",
String.valueOf(npcId),
", Your classId:",
String.valueOf(player.getClassId().getId()),
"<br>" +
"</body></html>"
);
html.setHtml(sb);
player.sendPacket(html);
return;
}
//Normal skills, No LearnedByFS, no AutoGet skills.
final FastList<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableSkills(player, classId, false, false);
final AcquireSkillList asl = new AcquireSkillList(AcquireSkillList.SkillType.ClassTransform);
int count = 0;
for (L2SkillLearn s: skills)
{
final L2Skill sk = SkillTable.getInstance().getInfo(s.getSkillId(), s.getSkillLevel());
if (sk != null)
{
asl.addSkill(s.getSkillId(), s.getSkillLevel(), s.getSkillLevel(), s.getLevelUpSp(), 0);
count++;
}
}
if (count == 0)
{
final FastMap<Integer, L2SkillLearn> skillTree = SkillTreesData.getInstance().getCompleteClassSkillTree(classId);
final int minLevel = SkillTreesData.getInstance().getMinLevelForNewSkill(player, skillTree);
if (minLevel > 0)
{
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1);
sm.addNumber(minLevel);
player.sendPacket(sm);
}
else
{
//TODO: Is this SysMsg really used here?
if (player.getClassId().level() == 1)
{
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.NO_SKILLS_TO_LEARN_RETURN_AFTER_S1_CLASS_CHANGE);
sm.addNumber(2);
player.sendPacket(sm);
}
else
{
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.NO_MORE_SKILLS_TO_LEARN));
}
}
}
else
{
player.sendPacket(asl);
}
}
}