/*
* Copyright (C) 2004-2014 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.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import com.l2jserver.gameserver.cache.HtmCache;
import com.l2jserver.gameserver.datatables.NpcBufferTable;
import com.l2jserver.gameserver.datatables.NpcBufferTable.NpcBufferData;
import com.l2jserver.gameserver.datatables.SkillData;
import com.l2jserver.gameserver.enums.InstanceType;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
import com.l2jserver.gameserver.model.skills.Skill;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
import com.l2jserver.gameserver.taskmanager.AttackStanceTaskManager;
/**
* The Class L2NpcBufferInstance.<br>
* Zoey76: TODO: Unhardcode as DP base script for NPC Buffers.
*/
public class L2NpcBufferInstance extends L2Npc
{
private static final Logger _log = Logger.getLogger(L2NpcBufferInstance.class.getName());
private static final Map<Integer, Integer> pageVal = new HashMap<>();
/**
* Instantiates a new l2 npc buffer instance.
* @param objectId the object id
* @param template the template
*/
public L2NpcBufferInstance(int objectId, L2NpcTemplate template)
{
super(objectId, template);
setInstanceType(InstanceType.L2NpcBufferInstance);
}
@Override
public void showChatWindow(L2PcInstance player, int val)
{
if (player == null)
{
return;
}
String htmContent = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "data/html/mods/NpcBuffer.htm");
if (val > 0)
{
htmContent = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "data/html/mods/NpcBuffer-" + val + ".htm");
}
if (htmContent != null)
{
final NpcHtmlMessage npcHtmlMessage = new NpcHtmlMessage(getObjectId());
npcHtmlMessage.setHtml(htmContent);
npcHtmlMessage.replace("%objectId%", String.valueOf(getObjectId()));
player.sendPacket(npcHtmlMessage);
}
player.sendPacket(ActionFailed.STATIC_PACKET);
}
@Override
public void onBypassFeedback(L2PcInstance player, String command)
{
// BypassValidation Exploit plug.
if ((player == null) || (player.getLastFolkNPC() == null) || (player.getLastFolkNPC().getObjectId() != getObjectId()))
{
return;
}
L2Character target = player;
if (command.startsWith("Pet"))
{
if (!player.hasSummon()) // TODO: Should be hasPet() ?
{
player.sendPacket(SystemMessageId.DONT_HAVE_PET);
showChatWindow(player, 0); // 0 = main window
return;
}
target = player.getSummon();
}
int npcId = getId();
if (command.startsWith("Chat"))
{
int val = Integer.parseInt(command.substring(5));
pageVal.put(player.getObjectId(), val);
showChatWindow(player, val);
}
else if (command.startsWith("Buff") || command.startsWith("PetBuff"))
{
String[] buffGroupArray = command.substring(command.indexOf("Buff") + 5).split(" ");
for (String buffGroupList : buffGroupArray)
{
if (buffGroupList == null)
{
_log.warning("NPC Buffer Warning: npcId = " + npcId + " has no buffGroup set in the bypass for the buff selected.");
return;
}
int buffGroup = Integer.parseInt(buffGroupList);
final NpcBufferData npcBuffGroupInfo = NpcBufferTable.getInstance().getSkillInfo(npcId, buffGroup);
if (npcBuffGroupInfo == null)
{
_log.warning("NPC Buffer Warning: npcId = " + npcId + " Location: " + getX() + ", " + getY() + ", " + getZ() + " Player: " + player.getName() + " has tried to use skill group (" + buffGroup + ") not assigned to the NPC Buffer!");
return;
}
if (npcBuffGroupInfo.getFee().getId() != 0)
{
L2ItemInstance itemInstance = player.getInventory().getItemByItemId(npcBuffGroupInfo.getFee().getId());
if ((itemInstance == null) || (!itemInstance.isStackable() && (player.getInventory().getInventoryItemCount(npcBuffGroupInfo.getFee().getId(), -1) < npcBuffGroupInfo.getFee().getCount())))
{
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THERE_ARE_NOT_ENOUGH_NECESSARY_ITEMS_TO_USE_THE_SKILL);
player.sendPacket(sm);
continue;
}
if (itemInstance.isStackable())
{
if (!player.destroyItemByItemId("Npc Buffer", npcBuffGroupInfo.getFee().getId(), npcBuffGroupInfo.getFee().getCount(), player.getTarget(), true))
{
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.THERE_ARE_NOT_ENOUGH_NECESSARY_ITEMS_TO_USE_THE_SKILL);
player.sendPacket(sm);
continue;
}
}
else
{
for (int i = 0; i < npcBuffGroupInfo.getFee().getCount(); ++i)
{
player.destroyItemByItemId("Npc Buffer", npcBuffGroupInfo.getFee().getId(), 1, player.getTarget(), true);
}
}
}
final Skill skill = SkillData.getInstance().getSkill(npcBuffGroupInfo.getSkill().getSkillId(), npcBuffGroupInfo.getSkill().getSkillLvl());
if (skill != null)
{
skill.applyEffects(player, target);
}
}
showChatWindow(player, pageVal.get(player.getObjectId()));
}
else if (command.startsWith("Heal") || command.startsWith("PetHeal"))
{
if (!target.isInCombat() && !AttackStanceTaskManager.getInstance().hasAttackStanceTask(target))
{
String[] healArray = command.substring(command.indexOf("Heal") + 5).split(" ");
for (String healType : healArray)
{
if (healType.equalsIgnoreCase("HP"))
{
target.setCurrentHp(target.getMaxHp());
}
else if (healType.equalsIgnoreCase("MP"))
{
target.setCurrentMp(target.getMaxMp());
}
else if (healType.equalsIgnoreCase("CP"))
{
target.setCurrentCp(target.getMaxCp());
}
}
}
showChatWindow(player, pageVal.get(player.getObjectId()));
}
else if (command.startsWith("RemoveBuffs") || command.startsWith("PetRemoveBuffs"))
{
target.stopAllEffectsExceptThoseThatLastThroughDeath();
showChatWindow(player, pageVal.get(player.getObjectId()));
}
else
{
super.onBypassFeedback(player, command);
}
}
}