/*
 * Copyright (C) 2004-2014 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 <http://www.gnu.org/licenses/>.
 */
package ai.group_template;

import static com.l2jserver.gameserver.util.GameTimeFunction.*;
import jp.sf.l2j.arrayMaps.SortedIntObjectArrayMap;
import ai.npc.AbstractNpcAI;

import com.l2jserver.gameserver.ai.CtrlEvent;
import com.l2jserver.gameserver.model.L2Object;
import com.l2jserver.gameserver.model.actor.L2Attackable;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.network.clientpackets.Say2;
import com.l2jserver.gameserver.network.serverpackets.NpcSay;

/**
 * Warrior Fishing Block AI.
 * @author Zoey76
 */
public final class WarriorFishingBlock extends AbstractNpcAI
{
	//@formatter:off
	// NPC Strings
	private static final int
		NPC_STRINGS_ON_SPAWN = 0,
		NPC_STRINGS_ON_ATTACK = 1,
		NPC_STRINGS_ON_KILL = 2;
	
	// fishingMonsters.xml
	private static final SortedIntObjectArrayMap<int[][]> NPC_STRINGS = new SortedIntObjectArrayMap<int[][]>()
		.append(18319, new int[][]{	// Caught Frog 釣れたカエル
			{
				1010400, // ケロケロッ！こんなところに$s1があるなんて！？
				1010401, // $s1、やったね！
				1010402, // 釣り間違えたって言えよ、$s1！
			},
			{
				1010403, // カエルを甘く見ちゃいかんよ。
				1010404, // カエルの力を見せてやろう！
				1010405, // 一口で飲み込んでやる！
			},
			{
				1010406, // ゴフッ．．．このオレ様が死ぬなんて！
				1010407, // ゲコゲコ！カエル殺し！
				1010408, // カエルは美味しくないですよ！あわわ。
			}
		})
		.append(18320, new int[][]{	// Caught Undine 釣れたウンディーネ
			{
				1010409, // きゃあっ！$s1、何するのっ？
				1010410, // ふふっ、$s1精霊の体に傷をつけるなんて。覚悟はできているんでしょうね？
				1010411, // あら、$s1 あなただったのね。でもね、こんな荒っぽい招待に喜ぶ女なんていないわよ？
			},
			{
				1010412, // あたしを怒らせたわね！
				1010413, // この傷、どうしてくれるのよっ！？
				1010414, // あんたも同じ目にあわせてやる！えいっ！
			},
			{
				1010415, // きゃあっ！そうきたわね、覚えてらっしゃい！
				1010416, // あなたのエサは食べるなって、他の魚たちに言いふらしてやる！
				1010417, // あたしみたいなか弱い精霊をいじめるなんて．．．うっうっ。
			}
		})
		.append(18321, new int[][]{	// Caught Rakul 釣れたラクル
			{
				1010418, // ケケケ．．．$s1．．．食べるぞ．．．ケケッ．．．
				1010419, // グルル．．．う．．．$s1．．．うらめしや．．．魚ども．．．
				1010420, // $s1？ケホッ．．．グル．．．グルッ．．．
			},
			{
				1010421, // クケケケケ！ラクル！スピン！アタアアアアアック！
				1010422, // おおっ！パプリオン！うおっ！うおっ！
				1010423, // ラクル！ラクル！ラァァクゥゥルゥゥ！
			},
			{
				1010424, // クエェ．．．恨み．．．魚．．．
				1010425, // 食われたくない．．．グアァ
				1010426, // グハッ！ラクル！ケホッケホッ！グエェ．．．
			}
		})
		.append(18322, new int[][]{	// Caught Sea Giant 釣れたシージャイアント
			{
				1010427, // パプリオンに栄光あれ！$s1には死を！
				1010428, // $s1、お前か！うちの可愛い魚たちをいじめてるのは！
				1010429, // 水竜様！$s1に呪いを！
			},
			{
				1010430, // ジャイアント スペシャル アタック！
				1010431, // 魚たちの恨みを思い知れ！
				1010432, // 俺の槍を食らってみろ！
			},
			{
				1010433, // パプリオン様に栄光あれ！
				1010434, // ぐはああ！
				1010435, // 老兵は死なず．．．ただ消え去るのみ．．．
			}
		})
		.append(18323, new int[][]{	// Caught Sea Horse Soldier 釣れたシーホース ソルジャー
			{
				1010436, // $s1、この水の騎士の挑戦を受けろ！
				1010437, // 魚たちの報告にあった$s1発見！
				1010438, // $s1、私がくわえたのはあんたのエサだったのか！
			},
			{
				1010439, // 龍宮城仕込みの槍術をご覧あれ！
				1010440, // あんたに贈る最期のプレゼントだぜ！
				1010441, // あんたのエサは旨かったよ！じゃあな！
			},
			{
				1010442, // 悔しい！我が同胞の恨みを！
				1010443, // 覚えてろ！この仇はきっと誰かが．．．
				1010444, // グフッ．．．しかしお前には捕まらないぞ！
			}
		})
		.append(18324, new int[][]{	// Caught Homunculus 釣れたホムンクルス
			{
				1010445, // $s1、すげぇぞ．．．
				1010446, // $s1、深海にいる俺を釣り上げるなんて．．．
				1010447, // $s1、俺が魚に見えるか。
			},
			{
				1010448, // はらほろひれ〜
				1010449, // クククッ、どれ、こんがり焼いてやろうか。
				1010450, // 水から出たからって油断してたんだろ？
			},
			{
				1010451, // うひゃ．．．痛い．．．いててててっ！
				1010452, // チェッ、失敗か．．．せっかく見つけたのに。
				1010453, // 生命活動．．．停止．．．ジジッ．．．
			},
		})
		.append(18325, new int[][]{	// Caught Flava 釣れたフラヴァ
			{
				1010454, // クルルッ！$s1〜クルッポー。
				1010455, // $s1の匂いがするぞぅ！
				1010456, // 美味しそうだな、$s1！
			},
			{
				1010457, // 食ってやるぞおおお！
				1010458, // うへへへ、久しぶりにありつくエサだな！
				1010459, // お前なんか一口さ！
			},
			{
				1010460, // ぐお．．．エサにやられるなんて！
				1010461, // お前は俺のエサなんだよ！捕って食ってやる！
				1010462, // エサに食われるなんて．．．クッ．．．
			},
		})
		.append(18326, new int[][]{	// Caught Gigantic Eye 釣れた大怪球
			{
				1010463, // 俺を釣ったのは$s1？
				1010464, // 俺に会えたことを光栄に思えよ、$s1。
				1010465, // $s1、生きて帰れるなんてこれっぽっちも思わないほうがいいぞ。
			},
			{
				1010466, // 深淵の力をとくと見ろ．．．
				1010467, // その釣り竿をへし折ってやる．．．
				1010468, // 貴様の屍は、この俺が美味しく頂こう．．．
			},
			{
				1010469, // ただの釣り師じゃなかったのか．．．
				1010470, // パプリオンが怖くないのか．．．
				1010471, // 素晴らしい、褒めてやるぞ．．．
			},
		});
	// Misc
	private static final int CHANCE_TO_SHOUT_ON_ATTACK = 33;
	private static final int MINIMAL_SHOUT_INTERVAL = 7; //[JOJO] 8 seconds
	private static final int DESPAWN_TIME = 50; // 50 seconds to despawn
	
	public WarriorFishingBlock()
	{
		super(WarriorFishingBlock.class.getSimpleName(), "ai/group_template");
		int[] MONSTERS = NPC_STRINGS.keySet();
		addAttackId(MONSTERS);
		addKillId(MONSTERS);
		addSpawnId(MONSTERS);
	}
	
	@Override
	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
	{
		switch (event)
		{
			case "SPAWN":
			{
				final L2Object obj = npc.getTarget();
				if ((obj == null) || !obj.isPlayer())
				{
					npc.deleteMe();
					return super.onSpawn(npc);
				}
				else
				{
					final L2PcInstance target = obj.getActingPlayer();
					
					final int now = currentTime();
					npc.setScriptValue(now + MINIMAL_SHOUT_INTERVAL);
					int[] npcStringId = NPC_STRINGS.get(npc.getId())[NPC_STRINGS_ON_SPAWN];
					npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, npcStringId[getRandom(npcStringId.length)])
					.addPcName(target));
					((L2Attackable) npc).addDamageHate(target, 0, 2000);
					npc.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, target);
					npc.addAttackerToAttackByList(target);
					startQuestTimer("DESPAWN", DESPAWN_TIME * 1000, npc, target);
				}
				break;
			}
			case "DESPAWN":
			{
				npc.deleteMe();
				break;
			}
		}
		return super.onAdvEvent(event, npc, player);
	}
	
	@Override
	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
	{
		final int now = currentTime();
		if (npc.getScriptValue() < now && getRandom(100) < CHANCE_TO_SHOUT_ON_ATTACK)
		{
			npc.setScriptValue(now + MINIMAL_SHOUT_INTERVAL);
			int[] npcStringId = NPC_STRINGS.get(npc.getId())[NPC_STRINGS_ON_ATTACK];
			npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, npcStringId[getRandom(npcStringId.length)]));
		}
		return super.onAttack(npc, attacker, damage, isSummon);
	}
	
	@Override
	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
	{
		int[] npcStringId = NPC_STRINGS.get(npc.getId())[NPC_STRINGS_ON_KILL];
		npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, npcStringId[getRandom(npcStringId.length)]));
		cancelQuestTimer("DESPAWN", npc, killer);
		return super.onKill(npc, killer, isSummon);
	}
	
	@Override
	public String onSpawn(L2Npc npc)	// <-- L2Fishing#spawnMonster
	{
		startQuestTimer("SPAWN", 2000, npc, null);
		return super.onSpawn(npc);
	}
	
	public static void main(String[] args)
	{
		new WarriorFishingBlock();
	}
}
