From 1c8461c6c9604b0360c786d3af0923f06979154f Mon Sep 17 00:00:00 2001 From: mobius <8391001+MobiusDevelopment@users.noreply.github.com> Date: Fri, 2 Jan 2015 14:36:55 +0000 Subject: [PATCH] Scarlet Van Halisha AI. --- trunk/dist/game/data/scripts.cfg | 1 + .../ai/individual/ScarletVanHalisha.java | 257 ++++++++++++++++++ 2 files changed, 258 insertions(+) create mode 100644 trunk/dist/game/data/scripts/ai/individual/ScarletVanHalisha.java diff --git a/trunk/dist/game/data/scripts.cfg b/trunk/dist/game/data/scripts.cfg index 4c5fa51436..397103d71b 100644 --- a/trunk/dist/game/data/scripts.cfg +++ b/trunk/dist/game/data/scripts.cfg @@ -148,6 +148,7 @@ ai/individual/QueenShyeed.java ai/individual/RagnaOrcCommander.java ai/individual/RagnaOrcSeer.java ai/individual/RagnaOrcHero.java +ai/individual/ScarletVanHalisha.java ai/individual/Shannon.java ai/individual/SinEater.java ai/individual/SinWardens.java diff --git a/trunk/dist/game/data/scripts/ai/individual/ScarletVanHalisha.java b/trunk/dist/game/data/scripts/ai/individual/ScarletVanHalisha.java new file mode 100644 index 0000000000..aa05e99e7a --- /dev/null +++ b/trunk/dist/game/data/scripts/ai/individual/ScarletVanHalisha.java @@ -0,0 +1,257 @@ +/* + * 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 . + */ +package ai.individual; + +import static com.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; +import static com.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_FOLLOW; +import static com.l2jserver.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; + +import java.util.Collection; + +import javolution.util.FastList; +import ai.npc.AbstractNpcAI; + +import com.l2jserver.gameserver.GeoData; +import com.l2jserver.gameserver.datatables.SkillData; +import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2DecoyInstance; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.skills.Skill; +import com.l2jserver.gameserver.util.Util; +import com.l2jserver.util.Rnd; + +/** + * @author Micr0, Zerox + */ +public class ScarletVanHalisha extends AbstractNpcAI +{ + private L2Character _target; + private Skill _skill; + + // NPCs + private static final int HALISHA2 = 29046; + private static final int HALISHA3 = 29047; + + public ScarletVanHalisha() + { + super(ScarletVanHalisha.class.getSimpleName(), "ai/individual"); + addAttackId(HALISHA2, HALISHA3); + addKillId(HALISHA2, HALISHA3); + addSpellFinishedId(HALISHA2, HALISHA3); + registerMobs(HALISHA2, HALISHA3); + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + switch (event) + { + case "attack": + { + if (npc != null) + { + getSkillAI(npc); + } + break; + } + case "random_target": + { + _target = getRandomTarget(npc); + break; + } + } + return super.onAdvEvent(event, npc, player); + } + + @Override + public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill) + { + getSkillAI(npc); + + return super.onSpellFinished(npc, player, skill); + } + + @Override + public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon) + { + startQuestTimer("random_Target", 5000, npc, null, true); + startQuestTimer("attack", 500, npc, null, true); + + return super.onAttack(npc, attacker, damage, isSummon); + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) + { + cancelQuestTimers("attack"); + cancelQuestTimers("random_Target"); + + return super.onKill(npc, killer, isSummon); + } + + private Skill getRndSkills(L2Npc npc) + { + switch (npc.getId()) + { + case HALISHA2: + { + if (Rnd.get(100) < 10) + { + return SkillData.getInstance().getSkill(5015, 2); + } + else if (Rnd.get(100) < 10) + { + return SkillData.getInstance().getSkill(5015, 5); + } + else if (Rnd.get(100) < 10) + { + return SkillData.getInstance().getSkill(5018, 1); + } + else if (Rnd.get(100) < 2) + { + return SkillData.getInstance().getSkill(5016, 1); + } + else + { + return SkillData.getInstance().getSkill(5014, 2); + } + } + case HALISHA3: + { + if (Rnd.get(100) < 10) + { + return SkillData.getInstance().getSkill(5015, 3); + } + else if (Rnd.get(100) < 10) + { + return SkillData.getInstance().getSkill(5015, 6); + } + else if (Rnd.get(100) < 10) + { + return SkillData.getInstance().getSkill(5015, 2); + } + else if (Rnd.get(100) < 10) + { + return SkillData.getInstance().getSkill(5019, 1); + } + else if (Rnd.get(100) < 2) + { + return SkillData.getInstance().getSkill(5016, 1); + } + else + { + return SkillData.getInstance().getSkill(5014, 3); + } + } + } + + return SkillData.getInstance().getSkill(5014, 1); + } + + private synchronized void getSkillAI(L2Npc npc) + { + if (npc.isInvul() || npc.isCastingNow()) + { + return; + } + if ((Rnd.get(100) < 30) || (_target == null) || _target.isDead()) + { + _target = getRandomTarget(npc); + if (_target != null) + { + _skill = getRndSkills(npc); + } + } + L2Character target = _target; + Skill skill = _skill; + if (skill == null) + { + skill = (getRndSkills(npc)); + } + + if (npc.isPhysicalMuted()) + { + return; + } + + if ((target == null) || target.isDead()) + { + npc.setIsCastingNow(false); + return; + } + + if (Util.checkIfInRange(skill.getCastRange(), npc, target, true)) + { + npc.getAI().setIntention(AI_INTENTION_IDLE); + npc.setTarget(target); + npc.setIsCastingNow(true); + _target = null; + npc.doCast(skill); + } + else + { + npc.getAI().setIntention(AI_INTENTION_FOLLOW, target, null); + npc.getAI().setIntention(AI_INTENTION_ATTACK, target, null); + npc.setIsCastingNow(false); + } + } + + private L2Character getRandomTarget(L2Npc npc) + { + Collection objs = npc.getKnownList().getKnownObjects().values(); + FastList result = new FastList<>(); + { + for (L2Object obj : objs) + { + if (obj.isPlayable() || (obj instanceof L2DecoyInstance)) + { + if (obj.isPlayer() && obj.getActingPlayer().isInvisible()) + { + continue; + } + + if (((((L2Character) obj).getZ() < (npc.getZ() - 100)) && (((L2Character) obj).getZ() > (npc.getZ() + 100))) || !(GeoData.getInstance().canSeeTarget(((L2Character) obj).getX(), ((L2Character) obj).getY(), ((L2Character) obj).getZ(), npc.getX(), npc.getY(), npc.getZ()))) + { + continue; + } + } + if (obj.isPlayable() || (obj instanceof L2DecoyInstance)) + { + if (Util.checkIfInRange(9000, npc, obj, true) && !((L2Character) obj).isDead()) + { + result.add((L2Character) obj); + } + } + } + } + if (!result.isEmpty() && (result.size() != 0)) + { + Object[] characters = result.toArray(); + return (L2Character) characters[Rnd.get(characters.length)]; + } + return null; + } + + public static void main(String[] args) + { + new ScarletVanHalisha(); + } +} \ No newline at end of file