From 628759e2e558e995d8d31d309742ae7e74582cf6 Mon Sep 17 00:00:00 2001 From: St3eT <St3eT@users.noreply.github.com> Date: Sat, 21 Jun 2014 15:21:42 +0000 Subject: [PATCH] BETA: Implementing '''Sin Eater''' AI, also dp-part for [L6567]. --- L2J_DataPack_BETA/dist/game/data/scripts.cfg | 1 + .../scripts/ai/individual/DivineBeast.java | 4 +- .../data/scripts/ai/individual/SinEater.java | 178 ++++++++++++++++++ .../scripts/ai/npc/Minigame/Minigame.java | 9 +- .../actionhandlers/L2PetInstanceAction.java | 6 + .../actionhandlers/L2SummonAction.java | 5 + .../handlers/effecthandlers/SoulEating.java | 12 +- .../effecthandlers/TriggerSkillByDamage.java | 15 +- 8 files changed, 199 insertions(+), 31 deletions(-) create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinEater.java diff --git a/L2J_DataPack_BETA/dist/game/data/scripts.cfg b/L2J_DataPack_BETA/dist/game/data/scripts.cfg index 637e134b63..f0f42cdab3 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts.cfg +++ b/L2J_DataPack_BETA/dist/game/data/scripts.cfg @@ -156,6 +156,7 @@ ai/individual/Maguen.java ai/individual/Orfen.java ai/individual/QueenAnt.java ai/individual/QueenShyeed.java +ai/individual/SinEater.java ai/individual/SinWardens.java ai/individual/Valakas.java diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DivineBeast.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DivineBeast.java index 52955d8e37..a23aa77b30 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DivineBeast.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/DivineBeast.java @@ -37,11 +37,11 @@ public final class DivineBeast extends AbstractNpcAI private DivineBeast() { super(DivineBeast.class.getSimpleName(), "ai"); - addSummonId(DIVINE_BEAST); + addSummonSpawnId(DIVINE_BEAST); } @Override - public void onSummon(L2Summon summon) + public void onSummonSpawn(L2Summon summon) { startQuestTimer("VALIDATE_TRANSFORMATION", CHECK_TIME, null, summon.getActingPlayer(), true); } diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinEater.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinEater.java new file mode 100644 index 0000000000..cf46097096 --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/individual/SinEater.java @@ -0,0 +1,178 @@ +/* + * 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.individual; + +import ai.npc.AbstractNpcAI; + +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.events.EventType; +import com.l2jserver.gameserver.model.events.ListenerRegisterType; +import com.l2jserver.gameserver.model.events.annotations.Id; +import com.l2jserver.gameserver.model.events.annotations.RegisterEvent; +import com.l2jserver.gameserver.model.events.annotations.RegisterType; +import com.l2jserver.gameserver.model.events.impl.character.OnCreatureAttacked; +import com.l2jserver.gameserver.model.events.impl.character.OnCreatureKill; +import com.l2jserver.gameserver.network.NpcStringId; +import com.l2jserver.gameserver.network.clientpackets.Say2; +import com.l2jserver.gameserver.network.serverpackets.NpcSay; + +/** + * Sin Eater AI. + * @author St3eT. + */ +public final class SinEater extends AbstractNpcAI +{ + // NPCs + private static final int SIN_EATER = 12564; + + private SinEater() + { + super(SinEater.class.getSimpleName(), "ai/individual"); + addSummonSpawnId(SIN_EATER); + addSummonTalkId(SIN_EATER); + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + if (event.equals("2001") && (player != null) && (player.getSummon() != null)) + { + if (getRandom(100) < 30) + { + final int random = getRandom(100); + final L2Summon summon = player.getSummon(); + + if (random < 20) + { + broadcastSummonSay(summon, NpcStringId.YAWWWWN_ITS_SO_BORING_HERE_WE_SHOULD_GO_AND_FIND_SOME_ACTION); + } + else if (random < 40) + { + broadcastSummonSay(summon, NpcStringId.HEY_IF_YOU_CONTINUE_TO_WASTE_TIME_YOU_WILL_NEVER_FINISH_YOUR_PENANCE); + } + else if (random < 60) + { + broadcastSummonSay(summon, NpcStringId.I_KNOW_YOU_DONT_LIKE_ME_THE_FEELING_IS_MUTUAL); + } + else if (random < 80) + { + broadcastSummonSay(summon, NpcStringId.I_NEED_A_DRINK); + } + else + { + broadcastSummonSay(summon, NpcStringId.OH_THIS_IS_DRAGGING_ON_TOO_LONG_AT_THIS_RATE_I_WONT_MAKE_IT_HOME_BEFORE_THE_SEVEN_SEALS_ARE_BROKEN); + } + } + startQuestTimer("2001", 60000, null, player); + } + return super.onAdvEvent(event, npc, player); + } + + @RegisterEvent(EventType.ON_CREATURE_KILL) + @RegisterType(ListenerRegisterType.NPC) + @Id(SIN_EATER) + public void onCreatureKill(OnCreatureKill event) + { + final int random = getRandom(100); + final L2Summon summon = (L2Summon) event.getTarget(); + + if (random < 30) + { + broadcastSummonSay(summon, NpcStringId.OH_THIS_IS_JUST_GREAT_WHAT_ARE_YOU_GOING_TO_DO_NOW); + } + else if (random < 70) + { + broadcastSummonSay(summon, NpcStringId.YOU_INCONSIDERATE_MORON_CANT_YOU_EVEN_TAKE_CARE_OF_LITTLE_OLD_ME); + } + else + { + broadcastSummonSay(summon, NpcStringId.OH_NO_THE_MAN_WHO_EATS_ONES_SINS_HAS_DIED_PENITENCE_IS_FURTHER_AWAY); + } + } + + @RegisterEvent(EventType.ON_CREATURE_ATTACKED) + @RegisterType(ListenerRegisterType.NPC) + @Id(SIN_EATER) + public void onCreatureAttacked(OnCreatureAttacked event) + { + if (getRandom(100) < 30) + { + final int random = getRandom(100); + final L2Summon summon = (L2Summon) event.getTarget(); + + if (random < 35) + { + broadcastSummonSay(summon, NpcStringId.OH_THAT_SMARTS); + } + else if (random < 70) + { + broadcastSummonSay(summon, NpcStringId.HEY_MASTER_PAY_ATTENTION_IM_DYING_OVER_HERE); + } + else + { + broadcastSummonSay(summon, NpcStringId.WHAT_HAVE_I_DONE_TO_DESERVE_THIS); + } + } + } + + @Override + public void onSummonSpawn(L2Summon summon) + { + broadcastSummonSay(summon, getRandomBoolean() ? NpcStringId.HEY_IT_SEEMS_LIKE_YOU_NEED_MY_HELP_DOESNT_IT : NpcStringId.ALMOST_GOT_IT_OUCH_STOP_DAMN_THESE_BLOODY_MANACLES); + startQuestTimer("2001", 60000, null, summon.getOwner()); + } + + @Override + public void onSummonTalk(L2Summon summon) + { + if (getRandom(100) < 10) + { + final int random = getRandom(100); + + if (random < 25) + { + broadcastSummonSay(summon, NpcStringId.USING_A_SPECIAL_SKILL_HERE_COULD_TRIGGER_A_BLOODBATH); + } + else if (random < 50) + { + broadcastSummonSay(summon, NpcStringId.HEY_WHAT_DO_YOU_EXPECT_OF_ME); + } + else if (random < 75) + { + broadcastSummonSay(summon, NpcStringId.UGGGGGH_PUSH_ITS_NOT_COMING_OUT); + } + else + { + broadcastSummonSay(summon, NpcStringId.AH_I_MISSED_THE_MARK); + } + } + } + + private void broadcastSummonSay(L2Summon summon, NpcStringId npcstringId) + { + summon.broadcastPacket(new NpcSay(summon.getObjectId(), Say2.NPC_ALL, summon.getId(), npcstringId)); + } + + public static void main(String[] args) + { + new SinEater(); + } +} \ No newline at end of file diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java index 6e39dc8552..872b04d417 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Minigame/Minigame.java @@ -28,7 +28,6 @@ import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.events.EventType; import com.l2jserver.gameserver.model.events.impl.character.OnCreatureSkillUse; -import com.l2jserver.gameserver.model.events.listeners.AbstractEventListener; import com.l2jserver.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.network.NpcStringId; @@ -293,13 +292,7 @@ public final class Minigame extends AbstractNpcAI broadcastNpcSay(room.getManager(), Say2.NPC_ALL, NpcStringId.AH_IVE_FAILED_GOING_FURTHER_WILL_BE_DIFFICULT); room.burnThemAll(); startQuestTimer("off", 2000, room.getManager(), null); - for (AbstractEventListener listener : room.getParticipant().getListeners(EventType.ON_CREATURE_SKILL_USE)) - { - if (listener.getOwner() == room) - { - listener.unregisterMe(); - } - } + room.getParticipant().removeListenerIf(EventType.ON_CREATURE_SKILL_USE, listener -> listener.getOwner() == room); startQuestTimer("end", 4000, room.getManager(), null); } else if (room.getAttemptNumber() < MAX_ATTEMPTS) diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java index 6c43cfa3f8..6216ee6dbe 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2PetInstanceAction.java @@ -25,8 +25,11 @@ import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.handler.IActionHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.actor.instance.L2PetInstance; +import com.l2jserver.gameserver.model.events.EventDispatcher; +import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSummonTalk; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.PetStatusShow; @@ -94,6 +97,9 @@ public class L2PetInstanceAction implements IActionHandler if (isOwner) { activeChar.sendPacket(new PetStatusShow((L2PetInstance) target)); + + // Notify to scripts + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonTalk((L2Summon) target), (L2Summon) target); } activeChar.updateNotMoveUntil(); } diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java index d7f4ee9198..0ee2e13313 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/actionhandlers/L2SummonAction.java @@ -26,6 +26,8 @@ import com.l2jserver.gameserver.handler.IActionHandler; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.actor.L2Summon; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.events.EventDispatcher; +import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerSummonTalk; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.ActionFailed; import com.l2jserver.gameserver.network.serverpackets.PetStatusShow; @@ -47,6 +49,9 @@ public class L2SummonAction implements IActionHandler activeChar.sendPacket(new PetStatusShow((L2Summon) target)); activeChar.updateNotMoveUntil(); activeChar.sendPacket(ActionFailed.STATIC_PACKET); + + // Notify to scripts + EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonTalk((L2Summon) target), (L2Summon) target); } else if (activeChar.getTarget() != target) { diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SoulEating.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SoulEating.java index 196423296a..441a277222 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SoulEating.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SoulEating.java @@ -25,9 +25,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.conditions.Condition; import com.l2jserver.gameserver.model.effects.AbstractEffect; import com.l2jserver.gameserver.model.events.EventType; -import com.l2jserver.gameserver.model.events.impl.character.playable.OnPlayableExpChanged; import com.l2jserver.gameserver.model.events.listeners.AbstractEventListener; -import com.l2jserver.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jserver.gameserver.model.skills.BuffInfo; import com.l2jserver.gameserver.model.stats.Stats; import com.l2jserver.gameserver.network.SystemMessageId; @@ -52,13 +50,7 @@ public final class SoulEating extends AbstractEffect { if (info.getEffected().isPlayer()) { - for (AbstractEventListener listener : info.getEffected().getListeners(EventType.ON_PLAYABLE_EXP_CHANGED)) - { - if (listener.getOwner() == this) - { - listener.unregisterMe(); - } - } + info.getEffected().getListeners(EventType.ON_PLAYABLE_EXP_CHANGED).stream().filter(listener -> listener.getOwner() == this).forEach(AbstractEventListener::unregisterMe); } } @@ -90,7 +82,7 @@ public final class SoulEating extends AbstractEffect { if (info.getEffected().isPlayer()) { - info.getEffected().addListener(new ConsumerEventListener(info.getEffected(), EventType.ON_PLAYABLE_EXP_CHANGED, (OnPlayableExpChanged event) -> onExperienceReceived(event.getActiveChar(), (event.getNewExp() - event.getOldExp())), this)); + info.getEffected().removeListenerIf(EventType.ON_PLAYABLE_EXP_CHANGED, listener -> listener.getOwner() == this); } } } diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TriggerSkillByDamage.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TriggerSkillByDamage.java index b4b0a3372c..6bf9b0fe11 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TriggerSkillByDamage.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/TriggerSkillByDamage.java @@ -27,8 +27,7 @@ import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.conditions.Condition; import com.l2jserver.gameserver.model.effects.AbstractEffect; import com.l2jserver.gameserver.model.events.EventType; -import com.l2jserver.gameserver.model.events.impl.character.OnCreatureDamage; -import com.l2jserver.gameserver.model.events.listeners.AbstractEventListener; +import com.l2jserver.gameserver.model.events.impl.character.OnCreatureDamageReceived; import com.l2jserver.gameserver.model.events.listeners.ConsumerEventListener; import com.l2jserver.gameserver.model.holders.SkillHolder; import com.l2jserver.gameserver.model.skills.BuffInfo; @@ -63,7 +62,7 @@ public final class TriggerSkillByDamage extends AbstractEffect _attackerType = params.getEnum("attackerType", InstanceType.class, InstanceType.L2Character); } - public void onDamageReceivedEvent(OnCreatureDamage event) + public void onDamageReceivedEvent(OnCreatureDamageReceived event) { if (event.isDamageOverTime() || (_chance == 0) || (_skill.getSkillLvl() == 0)) { @@ -112,18 +111,12 @@ public final class TriggerSkillByDamage extends AbstractEffect @Override public void onExit(BuffInfo info) { - for (AbstractEventListener listener : info.getEffected().getListeners(EventType.ON_CREATURE_DAMAGE)) - { - if (listener.getOwner() == this) - { - listener.unregisterMe(); - } - } + info.getEffected().removeListenerIf(EventType.ON_CREATURE_DAMAGE_RECEIVED, listener -> listener.getOwner() == this); } @Override public void onStart(BuffInfo info) { - info.getEffected().addListener(new ConsumerEventListener(info.getEffected(), EventType.ON_CREATURE_DAMAGE, (OnCreatureDamage event) -> onDamageReceivedEvent(event), this)); + info.getEffected().addListener(new ConsumerEventListener(info.getEffected(), EventType.ON_CREATURE_DAMAGE_RECEIVED, (OnCreatureDamageReceived event) -> onDamageReceivedEvent(event), this)); } } -- GitLab