Skip to content
Snippets Groups Projects
Commit a10bdc2e authored by Rumen Nikiforov's avatar Rumen Nikiforov
Browse files

BETA: DP-Part for [L6577]

parent 341d2903
No related branches found
No related tags found
No related merge requests found
......@@ -91,7 +91,6 @@ ai/fantasy_isle/MC_Show.java
ai/fantasy_isle/HandysBlockCheckerEvent.java
# Group Template
ai/group_template/L2AttackableAIScript.java
ai/group_template/AltarsOfSacrifice.java
ai/group_template/BeastFarm.java
ai/group_template/DenOfEvil.java
......
/*
* 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.ai.CtrlIntention.AI_INTENTION_ATTACK;
import java.util.List;
import ai.npc.AbstractNpcAI;
import com.l2jserver.Config;
import com.l2jserver.gameserver.ai.CtrlEvent;
import com.l2jserver.gameserver.ai.CtrlIntention;
import com.l2jserver.gameserver.datatables.NpcData;
import com.l2jserver.gameserver.instancemanager.DimensionalRiftManager;
import com.l2jserver.gameserver.model.L2Object;
import com.l2jserver.gameserver.model.actor.L2Attackable;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.actor.instance.L2RiftInvaderInstance;
import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
import com.l2jserver.gameserver.model.skills.Skill;
import com.l2jserver.gameserver.util.Util;
/**
* Overarching Superclass for all mob AI.
* @author Fulminus
*/
public final class L2AttackableAIScript extends AbstractNpcAI
{
private L2AttackableAIScript()
{
super(L2AttackableAIScript.class.getSimpleName(), "ai");
final List<L2NpcTemplate> templates = NpcData.getInstance().getTemplates(npc -> (npc.getLevel() >= 1) && (npc.getLevel() < 100));
// register all mobs here...
for (L2NpcTemplate t : templates)
{
try
{
if (L2Attackable.class.isAssignableFrom(Class.forName("com.l2jserver.gameserver.model.actor.instance." + t.getType() + "Instance")))
{
addAttackId(t.getId());
addKillId(t.getId());
addSkillSeeId(t.getId());
addSpawnId(t.getId());
addFactionCallId(t.getId());
addAggroRangeEnterId(t.getId());
}
}
catch (ClassNotFoundException ex)
{
_log.info("Class not found " + t.getType() + "Instance");
}
}
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
return null;
}
@Override
public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
{
return null;
}
@Override
public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isSummon)
{
if (caster == null)
{
return null;
}
if (!(npc instanceof L2Attackable))
{
return null;
}
L2Attackable attackable = (L2Attackable) npc;
int skillEffectPoint = skill.getEffectPoint();
if (caster.hasSummon())
{
if ((targets.length == 1) && Util.contains(targets, caster.getSummon()))
{
skillEffectPoint = 0;
}
}
if (skillEffectPoint > 0)
{
if (attackable.hasAI() && (attackable.getAI().getIntention() == AI_INTENTION_ATTACK))
{
L2Object npcTarget = attackable.getTarget();
for (L2Object skillTarget : targets)
{
if ((npcTarget == skillTarget) || (npc == skillTarget))
{
L2Character originalCaster = isSummon ? caster.getSummon() : caster;
attackable.addDamageHate(originalCaster, 0, (skillEffectPoint * 150) / (attackable.getLevel() + 7));
}
}
}
}
return null;
}
@Override
public String onFactionCall(L2Npc npc, L2Npc caller, L2PcInstance attacker, boolean isSummon)
{
if (attacker == null)
{
return null;
}
L2Character originalAttackTarget = (isSummon ? attacker.getSummon() : attacker);
if (attacker.isInParty() && attacker.getParty().isInDimensionalRift())
{
byte riftType = attacker.getParty().getDimensionalRift().getType();
byte riftRoom = attacker.getParty().getDimensionalRift().getCurrentRoom();
if ((caller instanceof L2RiftInvaderInstance) && !DimensionalRiftManager.getInstance().getRoom(riftType, riftRoom).checkIfInZone(npc.getX(), npc.getY(), npc.getZ()))
{
return null;
}
}
// By default, when a faction member calls for help, attack the caller's attacker.
// Notify the AI with EVT_AGGRESSION
npc.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, originalAttackTarget, 1);
return null;
}
@Override
public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isSummon)
{
if (player == null)
{
return null;
}
L2Character target = isSummon ? player.getSummon() : player;
((L2Attackable) npc).addDamageHate(target, 0, 1);
// Set the intention to the L2Attackable to AI_INTENTION_ACTIVE
if (npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_IDLE)
{
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
}
return null;
}
@Override
public String onSpawn(L2Npc npc)
{
return null;
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
{
if ((attacker != null) && (npc instanceof L2Attackable))
{
L2Attackable attackable = (L2Attackable) npc;
L2Character originalAttacker = isSummon ? attacker.getSummon() : attacker;
attackable.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, originalAttacker);
attackable.addDamageHate(originalAttacker, damage, (damage * 100) / (attackable.getLevel() + 7));
}
return null;
}
@Override
public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
{
if (npc instanceof L2MonsterInstance)
{
final L2MonsterInstance mob = (L2MonsterInstance) npc;
if ((mob.getLeader() != null) && mob.getLeader().hasMinions())
{
final int respawnTime = Config.MINIONS_RESPAWN_TIME.containsKey(npc.getId()) ? Config.MINIONS_RESPAWN_TIME.get(mob.getId()) * 1000 : -1;
mob.getLeader().getMinionList().onMinionDie(mob, respawnTime);
}
if (mob.hasMinions())
{
mob.getMinionList().onMasterDie(false);
}
}
return null;
}
public static void main(String[] args)
{
new L2AttackableAIScript();
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment