/*
* 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 2, 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package net.sf.l2j.gameserver.model.actor.instance;
import static net.sf.l2j.gameserver.ai.CtrlIntention.AI_INTENTION_ACTIVE;
import java.text.DateFormat;
import java.util.List;
import javolution.text.TextBuilder;
import javolution.util.FastList;
import net.sf.l2j.Config;
import net.sf.l2j.gameserver.Olympiad;
import net.sf.l2j.gameserver.SevenSigns;
import net.sf.l2j.gameserver.SevenSignsFestival;
import net.sf.l2j.gameserver.ThreadPoolManager;
import net.sf.l2j.gameserver.ai.CtrlIntention;
import net.sf.l2j.gameserver.cache.HtmCache;
import net.sf.l2j.gameserver.datatables.BuffTemplateTable;
import net.sf.l2j.gameserver.datatables.ClanTable;
import net.sf.l2j.gameserver.datatables.HelperBuffTable;
import net.sf.l2j.gameserver.datatables.ItemTable;
import net.sf.l2j.gameserver.datatables.SkillTable;
import net.sf.l2j.gameserver.datatables.SpawnTable;
import net.sf.l2j.gameserver.idfactory.IdFactory;
import net.sf.l2j.gameserver.instancemanager.CastleManager;
import net.sf.l2j.gameserver.instancemanager.DimensionalRiftManager;
import net.sf.l2j.gameserver.instancemanager.QuestManager;
import net.sf.l2j.gameserver.instancemanager.TownManager;
import net.sf.l2j.gameserver.instancemanager.games.Lottery;
import net.sf.l2j.gameserver.model.L2Attackable;
import net.sf.l2j.gameserver.model.L2Character;
import net.sf.l2j.gameserver.model.L2Clan;
import net.sf.l2j.gameserver.model.L2DropCategory;
import net.sf.l2j.gameserver.model.L2DropData;
import net.sf.l2j.gameserver.model.L2ItemInstance;
import net.sf.l2j.gameserver.model.L2Multisell;
import net.sf.l2j.gameserver.model.L2Object;
import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.L2Spawn;
import net.sf.l2j.gameserver.model.L2Summon;
import net.sf.l2j.gameserver.model.L2World;
import net.sf.l2j.gameserver.model.MobGroupTable;
import net.sf.l2j.gameserver.model.L2Skill.SkillType;
import net.sf.l2j.gameserver.model.actor.knownlist.NpcKnownList;
import net.sf.l2j.gameserver.model.actor.stat.NpcStat;
import net.sf.l2j.gameserver.model.actor.status.NpcStatus;
import net.sf.l2j.gameserver.model.entity.Castle;
import net.sf.l2j.gameserver.model.entity.L2Event;
import net.sf.l2j.gameserver.model.entity.L2JOneoEvents.CTF;
import net.sf.l2j.gameserver.model.entity.L2JOneoEvents.VIP;
import net.sf.l2j.gameserver.model.quest.Quest;
import net.sf.l2j.gameserver.model.quest.QuestState;
import net.sf.l2j.gameserver.model.zone.type.L2TownZone;
import net.sf.l2j.gameserver.network.L2GameClient;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.serverpackets.ActionFailed;
import net.sf.l2j.gameserver.serverpackets.ExShowVariationCancelWindow;
import net.sf.l2j.gameserver.serverpackets.ExShowVariationMakeWindow;
import net.sf.l2j.gameserver.serverpackets.InventoryUpdate;
import net.sf.l2j.gameserver.serverpackets.MyTargetSelected;
import net.sf.l2j.gameserver.serverpackets.NpcHtmlMessage;
import net.sf.l2j.gameserver.serverpackets.NpcInfo;
import net.sf.l2j.gameserver.serverpackets.RadarControl;
import net.sf.l2j.gameserver.serverpackets.SocialAction;
import net.sf.l2j.gameserver.serverpackets.StatusUpdate;
import net.sf.l2j.gameserver.serverpackets.SystemMessage;
import net.sf.l2j.gameserver.serverpackets.ValidateLocation;
import net.sf.l2j.gameserver.skills.Stats;
import net.sf.l2j.gameserver.taskmanager.DecayTaskManager;
import net.sf.l2j.gameserver.templates.L2HelperBuff;
import net.sf.l2j.gameserver.templates.L2Item;
import net.sf.l2j.gameserver.templates.L2NpcTemplate;
import net.sf.l2j.gameserver.templates.L2Weapon;
import net.sf.l2j.util.Rnd;
/**
* This class represents a Non-Player-Character in the world. It can be a
* monster or a friendly character. It also uses a template to fetch some static
* values. The templates are hardcoded in the client, so we can rely on them.
*
*
* L2Character :
*
*
| Object ID | " + getObjectId() + " | NPC ID | " + getTemplate().npcId + " |
| Castle | " + getCastle().getCastleId() + " | Coords | " + getX() + "," + getY() + "," + getZ() + " |
| Level | " + getLevel() + " | Aggro | " + (this instanceof L2Attackable ? ((L2Attackable) this).getAggroRange() : 0) + " |
| Current HP | " + getCurrentHp() + " | Current MP | " + getCurrentMp() + " |
| Max.HP | " + (int) (getMaxHp() / getStat().calcStat(Stats.MAX_HP, 1, this, null)) + "*" + getStat().calcStat(Stats.MAX_HP, 1, this, null) + " | Max.MP | " + getMaxMp() + " |
| P.Atk. | " + getPAtk(null) + " | M.Atk. | " + getMAtk(null, null) + " |
| P.Def. | " + getPDef(null) + " | M.Def. | " + getMDef(null, null) + " |
| Accuracy | " + getAccuracy() + " | Evasion | " + getEvasionRate(null) + " |
| Critical | " + getCriticalHit(null, null) + " | Speed | " + getRunSpeed() + " |
| Atk.Speed | " + getPAtkSpd() + " | Cast.Speed | " + getMAtkSpd() + " |
| STR | " + getSTR() + " | DEX | " + getDEX() + " | CON | " + getCON() + " |
| INT | " + getINT() + " | WIT | " + getWIT() + " | MEN | " + getMEN() + " |
| "); html1.append(" | |
| "); html1.append(" |
| Max.HP | " + (int) (getMaxHp() / getStat().calcStat(Stats.MAX_HP, 1, this, null)) + "*" + (int) getStat().calcStat(Stats.MAX_HP, 1, this, null) + " | Max.MP | " + getMaxMp() + " |
| P.Atk. | " + getPAtk(null) + " | M.Atk. | " + getMAtk(null, null) + " |
| P.Def. | " + getPDef(null) + " | M.Def. | " + getMDef(null, null) + " |
| Accuracy | " + getAccuracy() + " | Evasion | " + getEvasionRate(null) + " |
| Critical | " + getCriticalHit(null, null) + " | Speed | " + getRunSpeed() + " |
| Atk.Speed | " + getPAtkSpd() + " | Cast.Speed | " + getMAtkSpd() + " |
| Race | " + getTemplate().race + " |
| STR | " + getSTR() + " | DEX | " + getDEX() + " | CON | " + getCON() + " |
| INT | " + getINT() + " | WIT | " + getWIT() + " | MEN | " + getMEN() + " |
| Object ID | " + getObjectId() + " | NPC ID | " + getTemplate().npcId + " |
| Castle | " + getCastle().getCastleId() + " | Coords | " + getX() + "," + getY() + "," + getZ() + " |
| Level | " + getLevel() + " | Aggro | " + (this instanceof L2Attackable ? ((L2Attackable) this).getAggroRange() : 0) + " |
| Current HP | " + getCurrentHp() + " | Current MP | " + getCurrentMp() + " |
| Max.HP | " + (int) (getMaxHp() / getStat().calcStat(Stats.MAX_HP, 1, this, null)) + "*" + getStat().calcStat(Stats.MAX_HP, 1, this, null) + " | Max.MP | " + getMaxMp() + " |
| P.Atk. | " + getPAtk(null) + " | M.Atk. | " + getMAtk(null, null) + " |
| P.Def. | " + getPDef(null) + " | M.Def. | " + getMDef(null, null) + " |
| Accuracy | " + getAccuracy() + " | Evasion | " + getEvasionRate(null) + " |
| Critical | " + getCriticalHit(null, null) + " | Speed | " + getRunSpeed() + " |
| Atk.Speed | " + getPAtkSpd() + " | Cast.Speed | " + getMAtkSpd() + " |
| STR | " + getSTR() + " | DEX | " + getDEX() + " | CON | " + getCON() + " |
| INT | " + getINT() + " | WIT | " + getWIT() + " | MEN | " + getMEN() + " |
| "); html1.append(" | |
| "); html1.append(" |
| Max.HP | " + (int) (getMaxHp() / getStat().calcStat(Stats.MAX_HP, 1, this, null)) + "*" + (int) getStat().calcStat(Stats.MAX_HP, 1, this, null) + " | Max.MP | " + getMaxMp() + " |
| P.Atk. | " + getPAtk(null) + " | M.Atk. | " + getMAtk(null, null) + " |
| P.Def. | " + getPDef(null) + " | M.Def. | " + getMDef(null, null) + " |
| Accuracy | " + getAccuracy() + " | Evasion | " + getEvasionRate(null) + " |
| Critical | " + getCriticalHit(null, null) + " | Speed | " + getRunSpeed() + " |
| Atk.Speed | " + getPAtkSpd() + " | Cast.Speed | " + getMAtkSpd() + " |
| Race | " + getTemplate().race + " |
| STR | " + getSTR() + " | DEX | " + getDEX() + " | CON | " + getCON() + " |
| INT | " + getINT() + " | WIT | " + getWIT() + " | MEN | " + getMEN() + " |