From f8e2be116c1207853a52abd0ff2a3c5583d6c81c Mon Sep 17 00:00:00 2001
From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com>
Date: Tue, 26 Feb 2019 06:24:58 +0000
Subject: [PATCH] Proper listeners for agathion summoning.
---
.../effecthandlers/SummonAgathion.java | 2 +-
.../effecthandlers/UnsummonAgathion.java | 14 ++-
.../Q00500_BrothersBoundInChains.java | 115 ++++++++++--------
.../game/data/stats/items/36000-36099.xml | 1 +
.../model/events/AbstractScript.java | 8 --
.../gameserver/model/events/EventType.java | 2 +
.../player/OnPlayerUnsummonAgathion.java | 52 ++++++++
.../gameserver/model/quest/Quest.java | 22 ----
.../effecthandlers/SummonAgathion.java | 2 +-
.../effecthandlers/UnsummonAgathion.java | 14 ++-
.../Q00500_BrothersBoundInChains.java | 115 ++++++++++--------
.../game/data/stats/items/36000-36099.xml | 1 +
.../model/events/AbstractScript.java | 8 --
.../gameserver/model/events/EventType.java | 2 +
.../player/OnPlayerUnsummonAgathion.java | 52 ++++++++
.../gameserver/model/quest/Quest.java | 22 ----
.../effecthandlers/SummonAgathion.java | 2 +-
.../effecthandlers/UnsummonAgathion.java | 14 ++-
.../Q00500_BrothersBoundInChains.java | 113 +++++++++--------
.../game/data/stats/items/36000-36099.xml | 1 +
.../model/events/AbstractScript.java | 8 --
.../gameserver/model/events/EventType.java | 2 +
.../player/OnPlayerUnsummonAgathion.java | 52 ++++++++
.../gameserver/model/quest/Quest.java | 22 ----
.../effecthandlers/SummonAgathion.java | 2 +-
.../effecthandlers/UnsummonAgathion.java | 14 ++-
.../Q00500_BrothersBoundInChains.java | 113 +++++++++--------
.../game/data/stats/items/36000-36099.xml | 1 +
.../model/events/AbstractScript.java | 8 --
.../gameserver/model/events/EventType.java | 2 +
.../player/OnPlayerUnsummonAgathion.java | 52 ++++++++
.../gameserver/model/quest/Quest.java | 22 ----
.../effecthandlers/SummonAgathion.java | 2 +-
.../effecthandlers/UnsummonAgathion.java | 14 ++-
.../Q00500_BrothersBoundInChains.java | 113 +++++++++--------
.../game/data/stats/items/36000-36099.xml | 1 +
.../model/events/AbstractScript.java | 8 --
.../gameserver/model/events/EventType.java | 2 +
.../player/OnPlayerUnsummonAgathion.java | 52 ++++++++
.../gameserver/model/quest/Quest.java | 22 ----
.../effecthandlers/SummonAgathion.java | 2 +-
.../effecthandlers/UnsummonAgathion.java | 14 ++-
.../Q00500_BrothersBoundInChains.java | 113 +++++++++--------
.../game/data/stats/items/36000-36099.xml | 1 +
.../model/events/AbstractScript.java | 8 --
.../gameserver/model/events/EventType.java | 2 +
.../player/OnPlayerUnsummonAgathion.java | 52 ++++++++
.../gameserver/model/quest/Quest.java | 22 ----
.../effecthandlers/SummonAgathion.java | 2 +-
.../effecthandlers/UnsummonAgathion.java | 14 ++-
.../model/events/AbstractScript.java | 8 --
.../gameserver/model/events/EventType.java | 2 +
.../player/OnPlayerUnsummonAgathion.java | 52 ++++++++
.../gameserver/model/quest/Quest.java | 22 ----
.../effecthandlers/SummonAgathion.java | 2 +-
.../effecthandlers/UnsummonAgathion.java | 14 ++-
.../Q00500_BrothersBoundInChains.java | 53 ++++++--
.../game/data/stats/items/70800-70899.xml | 1 +
.../model/events/AbstractScript.java | 8 --
.../gameserver/model/events/EventType.java | 2 +
.../player/OnPlayerUnsummonAgathion.java | 52 ++++++++
.../gameserver/model/quest/Quest.java | 22 ----
.../effecthandlers/SummonAgathion.java | 2 +-
.../effecthandlers/UnsummonAgathion.java | 14 ++-
.../Q00500_BrothersBoundInChains.java | 53 ++++++--
.../game/data/stats/items/70800-70899.xml | 1 +
.../model/events/AbstractScript.java | 8 --
.../gameserver/model/events/EventType.java | 2 +
.../player/OnPlayerUnsummonAgathion.java | 52 ++++++++
.../gameserver/model/quest/Quest.java | 22 ----
.../effecthandlers/SummonAgathion.java | 2 +-
.../effecthandlers/UnsummonAgathion.java | 14 ++-
.../Q00500_BrothersBoundInChains.java | 53 ++++++--
.../game/data/stats/items/70800-70899.xml | 1 +
.../model/events/AbstractScript.java | 8 --
.../gameserver/model/events/EventType.java | 2 +
.../player/OnPlayerUnsummonAgathion.java | 52 ++++++++
.../gameserver/model/quest/Quest.java | 22 ----
78 files changed, 1172 insertions(+), 678 deletions(-)
create mode 100644 L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
create mode 100644 L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
create mode 100644 L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
create mode 100644 L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
create mode 100644 L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
create mode 100644 L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
create mode 100644 L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
create mode 100644 L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
create mode 100644 L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
create mode 100644 L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
index c73eb71458..f2d6f1b9c1 100644
--- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
+++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
@@ -64,6 +64,6 @@ public final class SummonAgathion extends AbstractEffect
player.sendPacket(new ExUserInfoCubic(player));
player.broadcastCharInfo();
- EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(effector.getActingPlayer(), _npcId));
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(player, _npcId));
}
}
diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
index abe6556524..b40b18f77f 100644
--- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
+++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
@@ -20,6 +20,8 @@ import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.events.EventDispatcher;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
@@ -46,9 +48,15 @@ public final class UnsummonAgathion extends AbstractEffect
final L2PcInstance player = effector.getActingPlayer();
if (player != null)
{
- player.setAgathionId(0);
- player.sendPacket(new ExUserInfoCubic(player));
- player.broadcastCharInfo();
+ final int agathionId = player.getAgathionId();
+ if (agathionId > 0)
+ {
+ player.setAgathionId(0);
+ player.sendPacket(new ExUserInfoCubic(player));
+ player.broadcastCharInfo();
+
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerUnsummonAgathion(player, agathionId));
+ }
}
}
}
diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
index e949f329ed..c5cd98677b 100644
--- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
+++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
@@ -16,28 +16,28 @@
*/
package quests.Q00500_BrothersBoundInChains;
-import java.util.stream.IntStream;
-
-import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.enums.QuestType;
-import com.l2jmobius.gameserver.model.CharEffectList;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.Containers;
import com.l2jmobius.gameserver.model.events.EventType;
import com.l2jmobius.gameserver.model.events.ListenerRegisterType;
import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import com.l2jmobius.gameserver.model.events.annotations.RegisterType;
import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableKill;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
+import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
- * @author Mathael
+ * Brothers Bound in Chains (500)
+ * @author Mathael, Mobius
* @URL https://l2wiki.com/Brothers_Bound_in_Chains
- * @version Infinite Odyssey
*/
public class Q00500_BrothersBoundInChains extends Quest
{
@@ -47,36 +47,24 @@ public class Q00500_BrothersBoundInChains extends Quest
private static final int GEMSTONE_B = 2132;
private static final int PENITENT_MANACLES = 36060;
private static final int CRUMBS_OF_PENITENCE = 36077;
- // Skills
- private static final int HOUR_OF_PENITENCE[] =
- {
- 15325,
- 15326,
- 15327,
- 15328,
- 15329
- };
- // Agathions
- private static final int SIN_EATERS[] =
- {
- 16098,
- 16099,
- 16100,
- 16101,
- 16102
- };
- // Misc
- private static final int DROP_QI_CHANCE = 1; // in % TODO: check that value
- private static final int MIN_LEVEL = 60;
+ // Skill
+ private static final int HOUR_OF_PENITENCE = 15325;
+ // Agathion
+ private static final int SIN_EATER = 16098;
+ // Others
+ private static final int DROP_QI_CHANCE = 5;
+ private static final int MIN_LEVEL = 85;
public Q00500_BrothersBoundInChains()
{
super(500);
addStartNpc(DARK_JUDGE);
addTalkId(DARK_JUDGE);
- addSummonAgathion();
registerQuestItems(PENITENT_MANACLES, CRUMBS_OF_PENITENCE);
addCondMinLevel(MIN_LEVEL, "30981-nopk.htm");
+
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_SUMMON_AGATHION, (OnPlayerSummonAgathion event) -> OnPlayerSummonAgathion(event), this));
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_UNSUMMON_AGATHION, (OnPlayerUnsummonAgathion event) -> OnPlayerUnsummonAgathion(event), this));
}
@Override
@@ -92,9 +80,9 @@ public class Q00500_BrothersBoundInChains extends Quest
{
case "buff":
{
- if (player != null)
+ if ((player != null) && (player.getAgathionId() == SIN_EATER))
{
- final Skill skill = SkillData.getInstance().getSkill(15325, 1); // Hour of Penitence
+ final Skill skill = SkillData.getInstance().getSkill(HOUR_OF_PENITENCE, 1); // Hour of Penitence
skill.activateSkill(player, player);
startQuestTimer("buff", 270000, null, player); // Rebuff every 4min30 (retail like)
}
@@ -128,7 +116,7 @@ public class Q00500_BrothersBoundInChains extends Quest
if (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10)
{
takeItems(player, CRUMBS_OF_PENITENCE, -1);
- player.setPkKills(Math.max(0, player.getPkKills() - Rnd.get(1, 10)));
+ player.setPkKills(Math.max(0, player.getPkKills() - getRandom(1, 10)));
qs.exitQuest(QuestType.DAILY, true);
}
else
@@ -192,45 +180,66 @@ public class Q00500_BrothersBoundInChains extends Quest
return htmltext;
}
- @Override
- public void onSummonAgathion(L2PcInstance player, int agathionId)
+ private void OnPlayerSummonAgathion(OnPlayerSummonAgathion event)
{
- if (IntStream.of(SIN_EATERS).anyMatch(x -> x == agathionId)) // TODO: Register IDs
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
{
startQuestTimer("buff", 2500, null, player);
}
}
+ private void OnPlayerUnsummonAgathion(OnPlayerUnsummonAgathion event)
+ {
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
+ {
+ cancelQuestTimer("buff", null, player);
+ player.getEffectList().stopSkillEffects(true, HOUR_OF_PENITENCE);
+ }
+ }
+
@RegisterEvent(EventType.ON_ATTACKABLE_KILL)
@RegisterType(ListenerRegisterType.GLOBAL_MONSTERS)
public void onAttackableKill(OnAttackableKill event)
{
- final QuestState qs = getQuestState(event.getAttacker(), false);
+ final L2PcInstance player = event.getAttacker();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return;
}
- // Player can drop more than 10 Crumbs of Penitence but there's no point in getting more than 10 (retail)
- boolean isAffectedByHourOfPenitence = false;
- final CharEffectList effects = event.getAttacker().getEffectList();
- for (int i = 0; !isAffectedByHourOfPenitence && (i < HOUR_OF_PENITENCE.length); i++)
+ if (player.getEffectList().isAffectedBySkill(HOUR_OF_PENITENCE) && (getRandom(100) < DROP_QI_CHANCE))
{
- if (effects.isAffectedBySkill(HOUR_OF_PENITENCE[i]))
+ giveItems(player, CRUMBS_OF_PENITENCE, 1);
+ if (!qs.isCond(2) && (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10))
{
- isAffectedByHourOfPenitence = true;
- }
- }
-
- if (isAffectedByHourOfPenitence)
- {
- if (Rnd.get(1, 100) <= DROP_QI_CHANCE)
- {
- giveItems(event.getAttacker(), CRUMBS_OF_PENITENCE, 1);
- if (!qs.isCond(2) && (getQuestItemsCount(event.getAttacker(), CRUMBS_OF_PENITENCE) >= 10))
- {
- qs.setCond(2, true);
- }
+ qs.setCond(2, true);
}
}
}
diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/items/36000-36099.xml b/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/items/36000-36099.xml
index 2cd4445020..3d84ae5c15 100644
--- a/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/items/36000-36099.xml
+++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/stats/items/36000-36099.xml
@@ -1282,6 +1282,7 @@
+
diff --git a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
index 83d2d134a0..068bdda136 100644
--- a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
+++ b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
@@ -100,7 +100,6 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogou
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionCancel;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
-import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
@@ -1506,13 +1505,6 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
return registerConsumer(callback, EventType.ON_INSTANCE_STATUS_CHANGE, ListenerRegisterType.INSTANCE, templateIds);
}
- // ---------------------------------------------------------------------------------------------------------------------------
-
- protected final List setPlayerSummonAgathion(Consumer callback)
- {
- return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_AGATHION, ListenerRegisterType.GLOBAL);
- }
-
// --------------------------------------------------------------------------------------------------
// --------------------------------Default listener register methods---------------------------------
// --------------------------------------------------------------------------------------------------
diff --git a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/EventType.java
index 8e7fae6586..971e86f681 100644
--- a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/EventType.java
+++ b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/EventType.java
@@ -111,6 +111,7 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummo
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerTransform;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarFinish;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarStart;
@@ -272,6 +273,7 @@ public enum EventType
ON_PLAYER_QUEST_ABORT(OnPlayerQuestAbort.class, void.class),
ON_PLAYER_QUEST_COMPLETE(OnPlayerQuestComplete.class, void.class),
ON_PLAYER_SUMMON_AGATHION(OnPlayerSummonAgathion.class, void.class),
+ ON_PLAYER_UNSUMMON_AGATHION(OnPlayerUnsummonAgathion.class, void.class),
// Trap events
ON_TRAP_ACTION(OnTrapAction.class, void.class),
diff --git a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
new file mode 100644
index 0000000000..22ea428fc9
--- /dev/null
+++ b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 3 of the License, 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, see .
+ */
+package com.l2jmobius.gameserver.model.events.impl.character.player;
+
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.EventType;
+import com.l2jmobius.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author Mobius
+ */
+public class OnPlayerUnsummonAgathion implements IBaseEvent
+{
+ private final L2PcInstance _player;
+ private final int _agathionId;
+
+ public OnPlayerUnsummonAgathion(L2PcInstance player, int agathionId)
+ {
+ _player = player;
+ _agathionId = agathionId;
+ }
+
+ public L2PcInstance getPlayer()
+ {
+ return _player;
+ }
+
+ public int getAgathionId()
+ {
+ return _agathionId;
+ }
+
+ @Override
+ public EventType getType()
+ {
+ return EventType.ON_PLAYER_UNSUMMON_AGATHION;
+ }
+}
diff --git a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/quest/Quest.java b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/quest/Quest.java
index 7e9ae29932..798049beac 100644
--- a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/quest/Quest.java
+++ b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/model/quest/Quest.java
@@ -999,19 +999,6 @@ public class Quest extends AbstractScript implements IIdentifiable
return false;
}
- public final void notifySummonAgathion(L2PcInstance player, int npcId)
- {
- try
- {
- onSummonAgathion(player, npcId);
- }
- catch (Exception e)
- {
- LOGGER.log(Level.WARNING, "Exception on onSummonAgathion() in notifySummonAgathion(): " + e.getMessage(), e);
- return;
- }
- }
-
// These are methods that java calls to invoke scripts.
/**
@@ -1494,10 +1481,6 @@ public class Quest extends AbstractScript implements IIdentifiable
{
}
- public void onSummonAgathion(L2PcInstance player, int agathionId)
- {
- }
-
/**
* @param npc
* @param player
@@ -2412,11 +2395,6 @@ public class Quest extends AbstractScript implements IIdentifiable
setInstanceLeaveId(event -> onInstanceLeave(event.getPlayer(), event.getInstanceWorld()), templateIds);
}
- public void addSummonAgathion()
- {
- setPlayerSummonAgathion(event -> notifySummonAgathion(event.getPlayer(), event.getAgathionId()));
- }
-
/**
* Use this method to get a random party member from a player's party.
* Useful when distributing rewards after killing an NPC.
diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
index c73eb71458..f2d6f1b9c1 100644
--- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
+++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
@@ -64,6 +64,6 @@ public final class SummonAgathion extends AbstractEffect
player.sendPacket(new ExUserInfoCubic(player));
player.broadcastCharInfo();
- EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(effector.getActingPlayer(), _npcId));
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(player, _npcId));
}
}
diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
index abe6556524..b40b18f77f 100644
--- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
+++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
@@ -20,6 +20,8 @@ import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.events.EventDispatcher;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
@@ -46,9 +48,15 @@ public final class UnsummonAgathion extends AbstractEffect
final L2PcInstance player = effector.getActingPlayer();
if (player != null)
{
- player.setAgathionId(0);
- player.sendPacket(new ExUserInfoCubic(player));
- player.broadcastCharInfo();
+ final int agathionId = player.getAgathionId();
+ if (agathionId > 0)
+ {
+ player.setAgathionId(0);
+ player.sendPacket(new ExUserInfoCubic(player));
+ player.broadcastCharInfo();
+
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerUnsummonAgathion(player, agathionId));
+ }
}
}
}
diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
index e949f329ed..c5cd98677b 100644
--- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
+++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
@@ -16,28 +16,28 @@
*/
package quests.Q00500_BrothersBoundInChains;
-import java.util.stream.IntStream;
-
-import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.enums.QuestType;
-import com.l2jmobius.gameserver.model.CharEffectList;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.Containers;
import com.l2jmobius.gameserver.model.events.EventType;
import com.l2jmobius.gameserver.model.events.ListenerRegisterType;
import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import com.l2jmobius.gameserver.model.events.annotations.RegisterType;
import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableKill;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
+import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
- * @author Mathael
+ * Brothers Bound in Chains (500)
+ * @author Mathael, Mobius
* @URL https://l2wiki.com/Brothers_Bound_in_Chains
- * @version Infinite Odyssey
*/
public class Q00500_BrothersBoundInChains extends Quest
{
@@ -47,36 +47,24 @@ public class Q00500_BrothersBoundInChains extends Quest
private static final int GEMSTONE_B = 2132;
private static final int PENITENT_MANACLES = 36060;
private static final int CRUMBS_OF_PENITENCE = 36077;
- // Skills
- private static final int HOUR_OF_PENITENCE[] =
- {
- 15325,
- 15326,
- 15327,
- 15328,
- 15329
- };
- // Agathions
- private static final int SIN_EATERS[] =
- {
- 16098,
- 16099,
- 16100,
- 16101,
- 16102
- };
- // Misc
- private static final int DROP_QI_CHANCE = 1; // in % TODO: check that value
- private static final int MIN_LEVEL = 60;
+ // Skill
+ private static final int HOUR_OF_PENITENCE = 15325;
+ // Agathion
+ private static final int SIN_EATER = 16098;
+ // Others
+ private static final int DROP_QI_CHANCE = 5;
+ private static final int MIN_LEVEL = 85;
public Q00500_BrothersBoundInChains()
{
super(500);
addStartNpc(DARK_JUDGE);
addTalkId(DARK_JUDGE);
- addSummonAgathion();
registerQuestItems(PENITENT_MANACLES, CRUMBS_OF_PENITENCE);
addCondMinLevel(MIN_LEVEL, "30981-nopk.htm");
+
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_SUMMON_AGATHION, (OnPlayerSummonAgathion event) -> OnPlayerSummonAgathion(event), this));
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_UNSUMMON_AGATHION, (OnPlayerUnsummonAgathion event) -> OnPlayerUnsummonAgathion(event), this));
}
@Override
@@ -92,9 +80,9 @@ public class Q00500_BrothersBoundInChains extends Quest
{
case "buff":
{
- if (player != null)
+ if ((player != null) && (player.getAgathionId() == SIN_EATER))
{
- final Skill skill = SkillData.getInstance().getSkill(15325, 1); // Hour of Penitence
+ final Skill skill = SkillData.getInstance().getSkill(HOUR_OF_PENITENCE, 1); // Hour of Penitence
skill.activateSkill(player, player);
startQuestTimer("buff", 270000, null, player); // Rebuff every 4min30 (retail like)
}
@@ -128,7 +116,7 @@ public class Q00500_BrothersBoundInChains extends Quest
if (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10)
{
takeItems(player, CRUMBS_OF_PENITENCE, -1);
- player.setPkKills(Math.max(0, player.getPkKills() - Rnd.get(1, 10)));
+ player.setPkKills(Math.max(0, player.getPkKills() - getRandom(1, 10)));
qs.exitQuest(QuestType.DAILY, true);
}
else
@@ -192,45 +180,66 @@ public class Q00500_BrothersBoundInChains extends Quest
return htmltext;
}
- @Override
- public void onSummonAgathion(L2PcInstance player, int agathionId)
+ private void OnPlayerSummonAgathion(OnPlayerSummonAgathion event)
{
- if (IntStream.of(SIN_EATERS).anyMatch(x -> x == agathionId)) // TODO: Register IDs
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
{
startQuestTimer("buff", 2500, null, player);
}
}
+ private void OnPlayerUnsummonAgathion(OnPlayerUnsummonAgathion event)
+ {
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
+ {
+ cancelQuestTimer("buff", null, player);
+ player.getEffectList().stopSkillEffects(true, HOUR_OF_PENITENCE);
+ }
+ }
+
@RegisterEvent(EventType.ON_ATTACKABLE_KILL)
@RegisterType(ListenerRegisterType.GLOBAL_MONSTERS)
public void onAttackableKill(OnAttackableKill event)
{
- final QuestState qs = getQuestState(event.getAttacker(), false);
+ final L2PcInstance player = event.getAttacker();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return;
}
- // Player can drop more than 10 Crumbs of Penitence but there's no point in getting more than 10 (retail)
- boolean isAffectedByHourOfPenitence = false;
- final CharEffectList effects = event.getAttacker().getEffectList();
- for (int i = 0; !isAffectedByHourOfPenitence && (i < HOUR_OF_PENITENCE.length); i++)
+ if (player.getEffectList().isAffectedBySkill(HOUR_OF_PENITENCE) && (getRandom(100) < DROP_QI_CHANCE))
{
- if (effects.isAffectedBySkill(HOUR_OF_PENITENCE[i]))
+ giveItems(player, CRUMBS_OF_PENITENCE, 1);
+ if (!qs.isCond(2) && (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10))
{
- isAffectedByHourOfPenitence = true;
- }
- }
-
- if (isAffectedByHourOfPenitence)
- {
- if (Rnd.get(1, 100) <= DROP_QI_CHANCE)
- {
- giveItems(event.getAttacker(), CRUMBS_OF_PENITENCE, 1);
- if (!qs.isCond(2) && (getQuestItemsCount(event.getAttacker(), CRUMBS_OF_PENITENCE) >= 10))
- {
- qs.setCond(2, true);
- }
+ qs.setCond(2, true);
}
}
}
diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/stats/items/36000-36099.xml b/L2J_Mobius_2.5_Underground/dist/game/data/stats/items/36000-36099.xml
index 607fcd3069..6e30632d89 100644
--- a/L2J_Mobius_2.5_Underground/dist/game/data/stats/items/36000-36099.xml
+++ b/L2J_Mobius_2.5_Underground/dist/game/data/stats/items/36000-36099.xml
@@ -1282,6 +1282,7 @@
+
diff --git a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
index 83d2d134a0..068bdda136 100644
--- a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
+++ b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
@@ -100,7 +100,6 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogou
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionCancel;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
-import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
@@ -1506,13 +1505,6 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
return registerConsumer(callback, EventType.ON_INSTANCE_STATUS_CHANGE, ListenerRegisterType.INSTANCE, templateIds);
}
- // ---------------------------------------------------------------------------------------------------------------------------
-
- protected final List setPlayerSummonAgathion(Consumer callback)
- {
- return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_AGATHION, ListenerRegisterType.GLOBAL);
- }
-
// --------------------------------------------------------------------------------------------------
// --------------------------------Default listener register methods---------------------------------
// --------------------------------------------------------------------------------------------------
diff --git a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/EventType.java
index 8e7fae6586..971e86f681 100644
--- a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/EventType.java
+++ b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/EventType.java
@@ -111,6 +111,7 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummo
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerTransform;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarFinish;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarStart;
@@ -272,6 +273,7 @@ public enum EventType
ON_PLAYER_QUEST_ABORT(OnPlayerQuestAbort.class, void.class),
ON_PLAYER_QUEST_COMPLETE(OnPlayerQuestComplete.class, void.class),
ON_PLAYER_SUMMON_AGATHION(OnPlayerSummonAgathion.class, void.class),
+ ON_PLAYER_UNSUMMON_AGATHION(OnPlayerUnsummonAgathion.class, void.class),
// Trap events
ON_TRAP_ACTION(OnTrapAction.class, void.class),
diff --git a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
new file mode 100644
index 0000000000..22ea428fc9
--- /dev/null
+++ b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 3 of the License, 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, see .
+ */
+package com.l2jmobius.gameserver.model.events.impl.character.player;
+
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.EventType;
+import com.l2jmobius.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author Mobius
+ */
+public class OnPlayerUnsummonAgathion implements IBaseEvent
+{
+ private final L2PcInstance _player;
+ private final int _agathionId;
+
+ public OnPlayerUnsummonAgathion(L2PcInstance player, int agathionId)
+ {
+ _player = player;
+ _agathionId = agathionId;
+ }
+
+ public L2PcInstance getPlayer()
+ {
+ return _player;
+ }
+
+ public int getAgathionId()
+ {
+ return _agathionId;
+ }
+
+ @Override
+ public EventType getType()
+ {
+ return EventType.ON_PLAYER_UNSUMMON_AGATHION;
+ }
+}
diff --git a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/quest/Quest.java b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/quest/Quest.java
index dda1f3205e..132378a4bb 100644
--- a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/quest/Quest.java
+++ b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/model/quest/Quest.java
@@ -1001,19 +1001,6 @@ public class Quest extends AbstractScript implements IIdentifiable
return false;
}
- public final void notifySummonAgathion(L2PcInstance player, int npcId)
- {
- try
- {
- onSummonAgathion(player, npcId);
- }
- catch (Exception e)
- {
- LOGGER.log(Level.WARNING, "Exception on onSummonAgathion() in notifySummonAgathion(): " + e.getMessage(), e);
- return;
- }
- }
-
// These are methods that java calls to invoke scripts.
/**
@@ -1496,10 +1483,6 @@ public class Quest extends AbstractScript implements IIdentifiable
{
}
- public void onSummonAgathion(L2PcInstance player, int agathionId)
- {
- }
-
/**
* @param npc
* @param player
@@ -2414,11 +2397,6 @@ public class Quest extends AbstractScript implements IIdentifiable
setInstanceLeaveId(event -> onInstanceLeave(event.getPlayer(), event.getInstanceWorld()), templateIds);
}
- public void addSummonAgathion()
- {
- setPlayerSummonAgathion(event -> notifySummonAgathion(event.getPlayer(), event.getAgathionId()));
- }
-
/**
* Use this method to get a random party member from a player's party.
* Useful when distributing rewards after killing an NPC.
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
index c73eb71458..f2d6f1b9c1 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
@@ -64,6 +64,6 @@ public final class SummonAgathion extends AbstractEffect
player.sendPacket(new ExUserInfoCubic(player));
player.broadcastCharInfo();
- EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(effector.getActingPlayer(), _npcId));
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(player, _npcId));
}
}
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
index abe6556524..b40b18f77f 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
@@ -20,6 +20,8 @@ import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.events.EventDispatcher;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
@@ -46,9 +48,15 @@ public final class UnsummonAgathion extends AbstractEffect
final L2PcInstance player = effector.getActingPlayer();
if (player != null)
{
- player.setAgathionId(0);
- player.sendPacket(new ExUserInfoCubic(player));
- player.broadcastCharInfo();
+ final int agathionId = player.getAgathionId();
+ if (agathionId > 0)
+ {
+ player.setAgathionId(0);
+ player.sendPacket(new ExUserInfoCubic(player));
+ player.broadcastCharInfo();
+
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerUnsummonAgathion(player, agathionId));
+ }
}
}
}
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
index db842fdcf4..c5cd98677b 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
@@ -16,28 +16,28 @@
*/
package quests.Q00500_BrothersBoundInChains;
-import java.util.stream.IntStream;
-
-import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.enums.QuestType;
-import com.l2jmobius.gameserver.model.CharEffectList;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.Containers;
import com.l2jmobius.gameserver.model.events.EventType;
import com.l2jmobius.gameserver.model.events.ListenerRegisterType;
import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import com.l2jmobius.gameserver.model.events.annotations.RegisterType;
import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableKill;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
+import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
- * @author Mathael
+ * Brothers Bound in Chains (500)
+ * @author Mathael, Mobius
* @URL https://l2wiki.com/Brothers_Bound_in_Chains
- * @version Infinite Odyssey
*/
public class Q00500_BrothersBoundInChains extends Quest
{
@@ -47,26 +47,12 @@ public class Q00500_BrothersBoundInChains extends Quest
private static final int GEMSTONE_B = 2132;
private static final int PENITENT_MANACLES = 36060;
private static final int CRUMBS_OF_PENITENCE = 36077;
- // Skills
- private static final int HOUR_OF_PENITENCE[] =
- {
- 15325,
- 15326,
- 15327,
- 15328,
- 15329
- };
- // Agathions
- private static final int SIN_EATERS[] =
- {
- 16098,
- 16099,
- 16100,
- 16101,
- 16102
- };
- // Misc
- private static final int DROP_QI_CHANCE = 5; // in % TODO: check that value
+ // Skill
+ private static final int HOUR_OF_PENITENCE = 15325;
+ // Agathion
+ private static final int SIN_EATER = 16098;
+ // Others
+ private static final int DROP_QI_CHANCE = 5;
private static final int MIN_LEVEL = 85;
public Q00500_BrothersBoundInChains()
@@ -74,9 +60,11 @@ public class Q00500_BrothersBoundInChains extends Quest
super(500);
addStartNpc(DARK_JUDGE);
addTalkId(DARK_JUDGE);
- addSummonAgathion();
registerQuestItems(PENITENT_MANACLES, CRUMBS_OF_PENITENCE);
addCondMinLevel(MIN_LEVEL, "30981-nopk.htm");
+
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_SUMMON_AGATHION, (OnPlayerSummonAgathion event) -> OnPlayerSummonAgathion(event), this));
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_UNSUMMON_AGATHION, (OnPlayerUnsummonAgathion event) -> OnPlayerUnsummonAgathion(event), this));
}
@Override
@@ -92,9 +80,9 @@ public class Q00500_BrothersBoundInChains extends Quest
{
case "buff":
{
- if (player != null)
+ if ((player != null) && (player.getAgathionId() == SIN_EATER))
{
- final Skill skill = SkillData.getInstance().getSkill(15325, 1); // Hour of Penitence
+ final Skill skill = SkillData.getInstance().getSkill(HOUR_OF_PENITENCE, 1); // Hour of Penitence
skill.activateSkill(player, player);
startQuestTimer("buff", 270000, null, player); // Rebuff every 4min30 (retail like)
}
@@ -128,7 +116,7 @@ public class Q00500_BrothersBoundInChains extends Quest
if (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10)
{
takeItems(player, CRUMBS_OF_PENITENCE, -1);
- player.setPkKills(Math.max(0, player.getPkKills() - Rnd.get(1, 10)));
+ player.setPkKills(Math.max(0, player.getPkKills() - getRandom(1, 10)));
qs.exitQuest(QuestType.DAILY, true);
}
else
@@ -192,45 +180,66 @@ public class Q00500_BrothersBoundInChains extends Quest
return htmltext;
}
- @Override
- public void onSummonAgathion(L2PcInstance player, int agathionId)
+ private void OnPlayerSummonAgathion(OnPlayerSummonAgathion event)
{
- if (IntStream.of(SIN_EATERS).anyMatch(x -> x == agathionId)) // TODO: Register IDs
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
{
startQuestTimer("buff", 2500, null, player);
}
}
+ private void OnPlayerUnsummonAgathion(OnPlayerUnsummonAgathion event)
+ {
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
+ {
+ cancelQuestTimer("buff", null, player);
+ player.getEffectList().stopSkillEffects(true, HOUR_OF_PENITENCE);
+ }
+ }
+
@RegisterEvent(EventType.ON_ATTACKABLE_KILL)
@RegisterType(ListenerRegisterType.GLOBAL_MONSTERS)
public void onAttackableKill(OnAttackableKill event)
{
- final QuestState qs = getQuestState(event.getAttacker(), false);
+ final L2PcInstance player = event.getAttacker();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return;
}
- // Player can drop more than 10 Crumbs of Penitence but there's no point in getting more than 10 (retail)
- boolean isAffectedByHourOfPenitence = false;
- final CharEffectList effects = event.getAttacker().getEffectList();
- for (int i = 0; !isAffectedByHourOfPenitence && (i < HOUR_OF_PENITENCE.length); i++)
+ if (player.getEffectList().isAffectedBySkill(HOUR_OF_PENITENCE) && (getRandom(100) < DROP_QI_CHANCE))
{
- if (effects.isAffectedBySkill(HOUR_OF_PENITENCE[i]))
+ giveItems(player, CRUMBS_OF_PENITENCE, 1);
+ if (!qs.isCond(2) && (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10))
{
- isAffectedByHourOfPenitence = true;
- }
- }
-
- if (isAffectedByHourOfPenitence)
- {
- if (Rnd.get(1, 100) <= DROP_QI_CHANCE)
- {
- giveItems(event.getAttacker(), CRUMBS_OF_PENITENCE, 1);
- if (!qs.isCond(2) && (getQuestItemsCount(event.getAttacker(), CRUMBS_OF_PENITENCE) >= 10))
- {
- qs.setCond(2, true);
- }
+ qs.setCond(2, true);
}
}
}
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/stats/items/36000-36099.xml b/L2J_Mobius_3.0_Helios/dist/game/data/stats/items/36000-36099.xml
index 80b0c6fa9b..a287395d0c 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/stats/items/36000-36099.xml
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/stats/items/36000-36099.xml
@@ -1282,6 +1282,7 @@
+
diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
index 5eead0123d..de0b88363e 100644
--- a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
+++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
@@ -101,7 +101,6 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogou
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionCancel;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
-import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
@@ -1507,13 +1506,6 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
return registerConsumer(callback, EventType.ON_INSTANCE_STATUS_CHANGE, ListenerRegisterType.INSTANCE, templateIds);
}
- // ---------------------------------------------------------------------------------------------------------------------------
-
- protected final List setPlayerSummonAgathion(Consumer callback)
- {
- return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_AGATHION, ListenerRegisterType.GLOBAL);
- }
-
// --------------------------------------------------------------------------------------------------
// --------------------------------Default listener register methods---------------------------------
// --------------------------------------------------------------------------------------------------
diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/EventType.java
index 8e7fae6586..971e86f681 100644
--- a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/EventType.java
+++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/EventType.java
@@ -111,6 +111,7 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummo
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerTransform;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarFinish;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarStart;
@@ -272,6 +273,7 @@ public enum EventType
ON_PLAYER_QUEST_ABORT(OnPlayerQuestAbort.class, void.class),
ON_PLAYER_QUEST_COMPLETE(OnPlayerQuestComplete.class, void.class),
ON_PLAYER_SUMMON_AGATHION(OnPlayerSummonAgathion.class, void.class),
+ ON_PLAYER_UNSUMMON_AGATHION(OnPlayerUnsummonAgathion.class, void.class),
// Trap events
ON_TRAP_ACTION(OnTrapAction.class, void.class),
diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
new file mode 100644
index 0000000000..22ea428fc9
--- /dev/null
+++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 3 of the License, 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, see .
+ */
+package com.l2jmobius.gameserver.model.events.impl.character.player;
+
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.EventType;
+import com.l2jmobius.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author Mobius
+ */
+public class OnPlayerUnsummonAgathion implements IBaseEvent
+{
+ private final L2PcInstance _player;
+ private final int _agathionId;
+
+ public OnPlayerUnsummonAgathion(L2PcInstance player, int agathionId)
+ {
+ _player = player;
+ _agathionId = agathionId;
+ }
+
+ public L2PcInstance getPlayer()
+ {
+ return _player;
+ }
+
+ public int getAgathionId()
+ {
+ return _agathionId;
+ }
+
+ @Override
+ public EventType getType()
+ {
+ return EventType.ON_PLAYER_UNSUMMON_AGATHION;
+ }
+}
diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/quest/Quest.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/quest/Quest.java
index 9e4273efbd..455fa929f9 100644
--- a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/quest/Quest.java
+++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/model/quest/Quest.java
@@ -1002,19 +1002,6 @@ public class Quest extends AbstractScript implements IIdentifiable
return false;
}
- public final void notifySummonAgathion(L2PcInstance player, int npcId)
- {
- try
- {
- onSummonAgathion(player, npcId);
- }
- catch (Exception e)
- {
- LOGGER.log(Level.WARNING, "Exception on onSummonAgathion() in notifySummonAgathion(): " + e.getMessage(), e);
- return;
- }
- }
-
// These are methods that java calls to invoke scripts.
/**
@@ -1497,10 +1484,6 @@ public class Quest extends AbstractScript implements IIdentifiable
{
}
- public void onSummonAgathion(L2PcInstance player, int agathionId)
- {
- }
-
/**
* @param npc
* @param player
@@ -2415,11 +2398,6 @@ public class Quest extends AbstractScript implements IIdentifiable
setInstanceLeaveId(event -> onInstanceLeave(event.getPlayer(), event.getInstanceWorld()), templateIds);
}
- public void addSummonAgathion()
- {
- setPlayerSummonAgathion(event -> notifySummonAgathion(event.getPlayer(), event.getAgathionId()));
- }
-
/**
* Use this method to get a random party member from a player's party.
* Useful when distributing rewards after killing an NPC.
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
index c73eb71458..f2d6f1b9c1 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
@@ -64,6 +64,6 @@ public final class SummonAgathion extends AbstractEffect
player.sendPacket(new ExUserInfoCubic(player));
player.broadcastCharInfo();
- EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(effector.getActingPlayer(), _npcId));
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(player, _npcId));
}
}
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
index abe6556524..b40b18f77f 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
@@ -20,6 +20,8 @@ import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.events.EventDispatcher;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
@@ -46,9 +48,15 @@ public final class UnsummonAgathion extends AbstractEffect
final L2PcInstance player = effector.getActingPlayer();
if (player != null)
{
- player.setAgathionId(0);
- player.sendPacket(new ExUserInfoCubic(player));
- player.broadcastCharInfo();
+ final int agathionId = player.getAgathionId();
+ if (agathionId > 0)
+ {
+ player.setAgathionId(0);
+ player.sendPacket(new ExUserInfoCubic(player));
+ player.broadcastCharInfo();
+
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerUnsummonAgathion(player, agathionId));
+ }
}
}
}
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
index db842fdcf4..c5cd98677b 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
@@ -16,28 +16,28 @@
*/
package quests.Q00500_BrothersBoundInChains;
-import java.util.stream.IntStream;
-
-import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.enums.QuestType;
-import com.l2jmobius.gameserver.model.CharEffectList;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.Containers;
import com.l2jmobius.gameserver.model.events.EventType;
import com.l2jmobius.gameserver.model.events.ListenerRegisterType;
import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import com.l2jmobius.gameserver.model.events.annotations.RegisterType;
import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableKill;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
+import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
- * @author Mathael
+ * Brothers Bound in Chains (500)
+ * @author Mathael, Mobius
* @URL https://l2wiki.com/Brothers_Bound_in_Chains
- * @version Infinite Odyssey
*/
public class Q00500_BrothersBoundInChains extends Quest
{
@@ -47,26 +47,12 @@ public class Q00500_BrothersBoundInChains extends Quest
private static final int GEMSTONE_B = 2132;
private static final int PENITENT_MANACLES = 36060;
private static final int CRUMBS_OF_PENITENCE = 36077;
- // Skills
- private static final int HOUR_OF_PENITENCE[] =
- {
- 15325,
- 15326,
- 15327,
- 15328,
- 15329
- };
- // Agathions
- private static final int SIN_EATERS[] =
- {
- 16098,
- 16099,
- 16100,
- 16101,
- 16102
- };
- // Misc
- private static final int DROP_QI_CHANCE = 5; // in % TODO: check that value
+ // Skill
+ private static final int HOUR_OF_PENITENCE = 15325;
+ // Agathion
+ private static final int SIN_EATER = 16098;
+ // Others
+ private static final int DROP_QI_CHANCE = 5;
private static final int MIN_LEVEL = 85;
public Q00500_BrothersBoundInChains()
@@ -74,9 +60,11 @@ public class Q00500_BrothersBoundInChains extends Quest
super(500);
addStartNpc(DARK_JUDGE);
addTalkId(DARK_JUDGE);
- addSummonAgathion();
registerQuestItems(PENITENT_MANACLES, CRUMBS_OF_PENITENCE);
addCondMinLevel(MIN_LEVEL, "30981-nopk.htm");
+
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_SUMMON_AGATHION, (OnPlayerSummonAgathion event) -> OnPlayerSummonAgathion(event), this));
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_UNSUMMON_AGATHION, (OnPlayerUnsummonAgathion event) -> OnPlayerUnsummonAgathion(event), this));
}
@Override
@@ -92,9 +80,9 @@ public class Q00500_BrothersBoundInChains extends Quest
{
case "buff":
{
- if (player != null)
+ if ((player != null) && (player.getAgathionId() == SIN_EATER))
{
- final Skill skill = SkillData.getInstance().getSkill(15325, 1); // Hour of Penitence
+ final Skill skill = SkillData.getInstance().getSkill(HOUR_OF_PENITENCE, 1); // Hour of Penitence
skill.activateSkill(player, player);
startQuestTimer("buff", 270000, null, player); // Rebuff every 4min30 (retail like)
}
@@ -128,7 +116,7 @@ public class Q00500_BrothersBoundInChains extends Quest
if (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10)
{
takeItems(player, CRUMBS_OF_PENITENCE, -1);
- player.setPkKills(Math.max(0, player.getPkKills() - Rnd.get(1, 10)));
+ player.setPkKills(Math.max(0, player.getPkKills() - getRandom(1, 10)));
qs.exitQuest(QuestType.DAILY, true);
}
else
@@ -192,45 +180,66 @@ public class Q00500_BrothersBoundInChains extends Quest
return htmltext;
}
- @Override
- public void onSummonAgathion(L2PcInstance player, int agathionId)
+ private void OnPlayerSummonAgathion(OnPlayerSummonAgathion event)
{
- if (IntStream.of(SIN_EATERS).anyMatch(x -> x == agathionId)) // TODO: Register IDs
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
{
startQuestTimer("buff", 2500, null, player);
}
}
+ private void OnPlayerUnsummonAgathion(OnPlayerUnsummonAgathion event)
+ {
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
+ {
+ cancelQuestTimer("buff", null, player);
+ player.getEffectList().stopSkillEffects(true, HOUR_OF_PENITENCE);
+ }
+ }
+
@RegisterEvent(EventType.ON_ATTACKABLE_KILL)
@RegisterType(ListenerRegisterType.GLOBAL_MONSTERS)
public void onAttackableKill(OnAttackableKill event)
{
- final QuestState qs = getQuestState(event.getAttacker(), false);
+ final L2PcInstance player = event.getAttacker();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return;
}
- // Player can drop more than 10 Crumbs of Penitence but there's no point in getting more than 10 (retail)
- boolean isAffectedByHourOfPenitence = false;
- final CharEffectList effects = event.getAttacker().getEffectList();
- for (int i = 0; !isAffectedByHourOfPenitence && (i < HOUR_OF_PENITENCE.length); i++)
+ if (player.getEffectList().isAffectedBySkill(HOUR_OF_PENITENCE) && (getRandom(100) < DROP_QI_CHANCE))
{
- if (effects.isAffectedBySkill(HOUR_OF_PENITENCE[i]))
+ giveItems(player, CRUMBS_OF_PENITENCE, 1);
+ if (!qs.isCond(2) && (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10))
{
- isAffectedByHourOfPenitence = true;
- }
- }
-
- if (isAffectedByHourOfPenitence)
- {
- if (Rnd.get(1, 100) <= DROP_QI_CHANCE)
- {
- giveItems(event.getAttacker(), CRUMBS_OF_PENITENCE, 1);
- if (!qs.isCond(2) && (getQuestItemsCount(event.getAttacker(), CRUMBS_OF_PENITENCE) >= 10))
- {
- qs.setCond(2, true);
- }
+ qs.setCond(2, true);
}
}
}
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/items/36000-36099.xml b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/items/36000-36099.xml
index 80b0c6fa9b..a287395d0c 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/items/36000-36099.xml
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/items/36000-36099.xml
@@ -1282,6 +1282,7 @@
+
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
index 5eead0123d..de0b88363e 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
@@ -101,7 +101,6 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogou
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionCancel;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
-import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
@@ -1507,13 +1506,6 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
return registerConsumer(callback, EventType.ON_INSTANCE_STATUS_CHANGE, ListenerRegisterType.INSTANCE, templateIds);
}
- // ---------------------------------------------------------------------------------------------------------------------------
-
- protected final List setPlayerSummonAgathion(Consumer callback)
- {
- return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_AGATHION, ListenerRegisterType.GLOBAL);
- }
-
// --------------------------------------------------------------------------------------------------
// --------------------------------Default listener register methods---------------------------------
// --------------------------------------------------------------------------------------------------
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/EventType.java
index 8e7fae6586..971e86f681 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/EventType.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/EventType.java
@@ -111,6 +111,7 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummo
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerTransform;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarFinish;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarStart;
@@ -272,6 +273,7 @@ public enum EventType
ON_PLAYER_QUEST_ABORT(OnPlayerQuestAbort.class, void.class),
ON_PLAYER_QUEST_COMPLETE(OnPlayerQuestComplete.class, void.class),
ON_PLAYER_SUMMON_AGATHION(OnPlayerSummonAgathion.class, void.class),
+ ON_PLAYER_UNSUMMON_AGATHION(OnPlayerUnsummonAgathion.class, void.class),
// Trap events
ON_TRAP_ACTION(OnTrapAction.class, void.class),
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
new file mode 100644
index 0000000000..22ea428fc9
--- /dev/null
+++ b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 3 of the License, 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, see .
+ */
+package com.l2jmobius.gameserver.model.events.impl.character.player;
+
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.EventType;
+import com.l2jmobius.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author Mobius
+ */
+public class OnPlayerUnsummonAgathion implements IBaseEvent
+{
+ private final L2PcInstance _player;
+ private final int _agathionId;
+
+ public OnPlayerUnsummonAgathion(L2PcInstance player, int agathionId)
+ {
+ _player = player;
+ _agathionId = agathionId;
+ }
+
+ public L2PcInstance getPlayer()
+ {
+ return _player;
+ }
+
+ public int getAgathionId()
+ {
+ return _agathionId;
+ }
+
+ @Override
+ public EventType getType()
+ {
+ return EventType.ON_PLAYER_UNSUMMON_AGATHION;
+ }
+}
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/quest/Quest.java b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/quest/Quest.java
index 49f17ec208..221fc3baca 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/quest/Quest.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/model/quest/Quest.java
@@ -1002,19 +1002,6 @@ public class Quest extends AbstractScript implements IIdentifiable
return false;
}
- public final void notifySummonAgathion(L2PcInstance player, int npcId)
- {
- try
- {
- onSummonAgathion(player, npcId);
- }
- catch (Exception e)
- {
- LOGGER.log(Level.WARNING, "Exception on onSummonAgathion() in notifySummonAgathion(): " + e.getMessage(), e);
- return;
- }
- }
-
// These are methods that java calls to invoke scripts.
/**
@@ -1497,10 +1484,6 @@ public class Quest extends AbstractScript implements IIdentifiable
{
}
- public void onSummonAgathion(L2PcInstance player, int agathionId)
- {
- }
-
/**
* @param npc
* @param player
@@ -2415,11 +2398,6 @@ public class Quest extends AbstractScript implements IIdentifiable
setInstanceLeaveId(event -> onInstanceLeave(event.getPlayer(), event.getInstanceWorld()), templateIds);
}
- public void addSummonAgathion()
- {
- setPlayerSummonAgathion(event -> notifySummonAgathion(event.getPlayer(), event.getAgathionId()));
- }
-
/**
* Use this method to get a random party member from a player's party.
* Useful when distributing rewards after killing an NPC.
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
index c73eb71458..f2d6f1b9c1 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
@@ -64,6 +64,6 @@ public final class SummonAgathion extends AbstractEffect
player.sendPacket(new ExUserInfoCubic(player));
player.broadcastCharInfo();
- EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(effector.getActingPlayer(), _npcId));
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(player, _npcId));
}
}
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
index abe6556524..b40b18f77f 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
@@ -20,6 +20,8 @@ import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.events.EventDispatcher;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
@@ -46,9 +48,15 @@ public final class UnsummonAgathion extends AbstractEffect
final L2PcInstance player = effector.getActingPlayer();
if (player != null)
{
- player.setAgathionId(0);
- player.sendPacket(new ExUserInfoCubic(player));
- player.broadcastCharInfo();
+ final int agathionId = player.getAgathionId();
+ if (agathionId > 0)
+ {
+ player.setAgathionId(0);
+ player.sendPacket(new ExUserInfoCubic(player));
+ player.broadcastCharInfo();
+
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerUnsummonAgathion(player, agathionId));
+ }
}
}
}
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
index db842fdcf4..c5cd98677b 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
@@ -16,28 +16,28 @@
*/
package quests.Q00500_BrothersBoundInChains;
-import java.util.stream.IntStream;
-
-import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.enums.QuestType;
-import com.l2jmobius.gameserver.model.CharEffectList;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.Containers;
import com.l2jmobius.gameserver.model.events.EventType;
import com.l2jmobius.gameserver.model.events.ListenerRegisterType;
import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import com.l2jmobius.gameserver.model.events.annotations.RegisterType;
import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableKill;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
+import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
- * @author Mathael
+ * Brothers Bound in Chains (500)
+ * @author Mathael, Mobius
* @URL https://l2wiki.com/Brothers_Bound_in_Chains
- * @version Infinite Odyssey
*/
public class Q00500_BrothersBoundInChains extends Quest
{
@@ -47,26 +47,12 @@ public class Q00500_BrothersBoundInChains extends Quest
private static final int GEMSTONE_B = 2132;
private static final int PENITENT_MANACLES = 36060;
private static final int CRUMBS_OF_PENITENCE = 36077;
- // Skills
- private static final int HOUR_OF_PENITENCE[] =
- {
- 15325,
- 15326,
- 15327,
- 15328,
- 15329
- };
- // Agathions
- private static final int SIN_EATERS[] =
- {
- 16098,
- 16099,
- 16100,
- 16101,
- 16102
- };
- // Misc
- private static final int DROP_QI_CHANCE = 5; // in % TODO: check that value
+ // Skill
+ private static final int HOUR_OF_PENITENCE = 15325;
+ // Agathion
+ private static final int SIN_EATER = 16098;
+ // Others
+ private static final int DROP_QI_CHANCE = 5;
private static final int MIN_LEVEL = 85;
public Q00500_BrothersBoundInChains()
@@ -74,9 +60,11 @@ public class Q00500_BrothersBoundInChains extends Quest
super(500);
addStartNpc(DARK_JUDGE);
addTalkId(DARK_JUDGE);
- addSummonAgathion();
registerQuestItems(PENITENT_MANACLES, CRUMBS_OF_PENITENCE);
addCondMinLevel(MIN_LEVEL, "30981-nopk.htm");
+
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_SUMMON_AGATHION, (OnPlayerSummonAgathion event) -> OnPlayerSummonAgathion(event), this));
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_UNSUMMON_AGATHION, (OnPlayerUnsummonAgathion event) -> OnPlayerUnsummonAgathion(event), this));
}
@Override
@@ -92,9 +80,9 @@ public class Q00500_BrothersBoundInChains extends Quest
{
case "buff":
{
- if (player != null)
+ if ((player != null) && (player.getAgathionId() == SIN_EATER))
{
- final Skill skill = SkillData.getInstance().getSkill(15325, 1); // Hour of Penitence
+ final Skill skill = SkillData.getInstance().getSkill(HOUR_OF_PENITENCE, 1); // Hour of Penitence
skill.activateSkill(player, player);
startQuestTimer("buff", 270000, null, player); // Rebuff every 4min30 (retail like)
}
@@ -128,7 +116,7 @@ public class Q00500_BrothersBoundInChains extends Quest
if (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10)
{
takeItems(player, CRUMBS_OF_PENITENCE, -1);
- player.setPkKills(Math.max(0, player.getPkKills() - Rnd.get(1, 10)));
+ player.setPkKills(Math.max(0, player.getPkKills() - getRandom(1, 10)));
qs.exitQuest(QuestType.DAILY, true);
}
else
@@ -192,45 +180,66 @@ public class Q00500_BrothersBoundInChains extends Quest
return htmltext;
}
- @Override
- public void onSummonAgathion(L2PcInstance player, int agathionId)
+ private void OnPlayerSummonAgathion(OnPlayerSummonAgathion event)
{
- if (IntStream.of(SIN_EATERS).anyMatch(x -> x == agathionId)) // TODO: Register IDs
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
{
startQuestTimer("buff", 2500, null, player);
}
}
+ private void OnPlayerUnsummonAgathion(OnPlayerUnsummonAgathion event)
+ {
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
+ {
+ cancelQuestTimer("buff", null, player);
+ player.getEffectList().stopSkillEffects(true, HOUR_OF_PENITENCE);
+ }
+ }
+
@RegisterEvent(EventType.ON_ATTACKABLE_KILL)
@RegisterType(ListenerRegisterType.GLOBAL_MONSTERS)
public void onAttackableKill(OnAttackableKill event)
{
- final QuestState qs = getQuestState(event.getAttacker(), false);
+ final L2PcInstance player = event.getAttacker();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return;
}
- // Player can drop more than 10 Crumbs of Penitence but there's no point in getting more than 10 (retail)
- boolean isAffectedByHourOfPenitence = false;
- final CharEffectList effects = event.getAttacker().getEffectList();
- for (int i = 0; !isAffectedByHourOfPenitence && (i < HOUR_OF_PENITENCE.length); i++)
+ if (player.getEffectList().isAffectedBySkill(HOUR_OF_PENITENCE) && (getRandom(100) < DROP_QI_CHANCE))
{
- if (effects.isAffectedBySkill(HOUR_OF_PENITENCE[i]))
+ giveItems(player, CRUMBS_OF_PENITENCE, 1);
+ if (!qs.isCond(2) && (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10))
{
- isAffectedByHourOfPenitence = true;
- }
- }
-
- if (isAffectedByHourOfPenitence)
- {
- if (Rnd.get(1, 100) <= DROP_QI_CHANCE)
- {
- giveItems(event.getAttacker(), CRUMBS_OF_PENITENCE, 1);
- if (!qs.isCond(2) && (getQuestItemsCount(event.getAttacker(), CRUMBS_OF_PENITENCE) >= 10))
- {
- qs.setCond(2, true);
- }
+ qs.setCond(2, true);
}
}
}
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/items/36000-36099.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/items/36000-36099.xml
index cb457847e4..78052f04fb 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/items/36000-36099.xml
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/items/36000-36099.xml
@@ -1282,6 +1282,7 @@
+
diff --git a/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
index 5eead0123d..de0b88363e 100644
--- a/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
+++ b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
@@ -101,7 +101,6 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogou
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionCancel;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
-import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
@@ -1507,13 +1506,6 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
return registerConsumer(callback, EventType.ON_INSTANCE_STATUS_CHANGE, ListenerRegisterType.INSTANCE, templateIds);
}
- // ---------------------------------------------------------------------------------------------------------------------------
-
- protected final List setPlayerSummonAgathion(Consumer callback)
- {
- return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_AGATHION, ListenerRegisterType.GLOBAL);
- }
-
// --------------------------------------------------------------------------------------------------
// --------------------------------Default listener register methods---------------------------------
// --------------------------------------------------------------------------------------------------
diff --git a/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/EventType.java
index 8e7fae6586..971e86f681 100644
--- a/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/EventType.java
+++ b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/EventType.java
@@ -111,6 +111,7 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummo
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerTransform;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarFinish;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarStart;
@@ -272,6 +273,7 @@ public enum EventType
ON_PLAYER_QUEST_ABORT(OnPlayerQuestAbort.class, void.class),
ON_PLAYER_QUEST_COMPLETE(OnPlayerQuestComplete.class, void.class),
ON_PLAYER_SUMMON_AGATHION(OnPlayerSummonAgathion.class, void.class),
+ ON_PLAYER_UNSUMMON_AGATHION(OnPlayerUnsummonAgathion.class, void.class),
// Trap events
ON_TRAP_ACTION(OnTrapAction.class, void.class),
diff --git a/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
new file mode 100644
index 0000000000..22ea428fc9
--- /dev/null
+++ b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 3 of the License, 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, see .
+ */
+package com.l2jmobius.gameserver.model.events.impl.character.player;
+
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.EventType;
+import com.l2jmobius.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author Mobius
+ */
+public class OnPlayerUnsummonAgathion implements IBaseEvent
+{
+ private final L2PcInstance _player;
+ private final int _agathionId;
+
+ public OnPlayerUnsummonAgathion(L2PcInstance player, int agathionId)
+ {
+ _player = player;
+ _agathionId = agathionId;
+ }
+
+ public L2PcInstance getPlayer()
+ {
+ return _player;
+ }
+
+ public int getAgathionId()
+ {
+ return _agathionId;
+ }
+
+ @Override
+ public EventType getType()
+ {
+ return EventType.ON_PLAYER_UNSUMMON_AGATHION;
+ }
+}
diff --git a/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/quest/Quest.java b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/quest/Quest.java
index 49f17ec208..221fc3baca 100644
--- a/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/quest/Quest.java
+++ b/L2J_Mobius_5.0_Salvation/java/com/l2jmobius/gameserver/model/quest/Quest.java
@@ -1002,19 +1002,6 @@ public class Quest extends AbstractScript implements IIdentifiable
return false;
}
- public final void notifySummonAgathion(L2PcInstance player, int npcId)
- {
- try
- {
- onSummonAgathion(player, npcId);
- }
- catch (Exception e)
- {
- LOGGER.log(Level.WARNING, "Exception on onSummonAgathion() in notifySummonAgathion(): " + e.getMessage(), e);
- return;
- }
- }
-
// These are methods that java calls to invoke scripts.
/**
@@ -1497,10 +1484,6 @@ public class Quest extends AbstractScript implements IIdentifiable
{
}
- public void onSummonAgathion(L2PcInstance player, int agathionId)
- {
- }
-
/**
* @param npc
* @param player
@@ -2415,11 +2398,6 @@ public class Quest extends AbstractScript implements IIdentifiable
setInstanceLeaveId(event -> onInstanceLeave(event.getPlayer(), event.getInstanceWorld()), templateIds);
}
- public void addSummonAgathion()
- {
- setPlayerSummonAgathion(event -> notifySummonAgathion(event.getPlayer(), event.getAgathionId()));
- }
-
/**
* Use this method to get a random party member from a player's party.
* Useful when distributing rewards after killing an NPC.
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
index c73eb71458..f2d6f1b9c1 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
@@ -64,6 +64,6 @@ public final class SummonAgathion extends AbstractEffect
player.sendPacket(new ExUserInfoCubic(player));
player.broadcastCharInfo();
- EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(effector.getActingPlayer(), _npcId));
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(player, _npcId));
}
}
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
index abe6556524..b40b18f77f 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
@@ -20,6 +20,8 @@ import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.events.EventDispatcher;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
@@ -46,9 +48,15 @@ public final class UnsummonAgathion extends AbstractEffect
final L2PcInstance player = effector.getActingPlayer();
if (player != null)
{
- player.setAgathionId(0);
- player.sendPacket(new ExUserInfoCubic(player));
- player.broadcastCharInfo();
+ final int agathionId = player.getAgathionId();
+ if (agathionId > 0)
+ {
+ player.setAgathionId(0);
+ player.sendPacket(new ExUserInfoCubic(player));
+ player.broadcastCharInfo();
+
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerUnsummonAgathion(player, agathionId));
+ }
}
}
}
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
index db842fdcf4..c5cd98677b 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
@@ -16,28 +16,28 @@
*/
package quests.Q00500_BrothersBoundInChains;
-import java.util.stream.IntStream;
-
-import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.enums.QuestType;
-import com.l2jmobius.gameserver.model.CharEffectList;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.Containers;
import com.l2jmobius.gameserver.model.events.EventType;
import com.l2jmobius.gameserver.model.events.ListenerRegisterType;
import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import com.l2jmobius.gameserver.model.events.annotations.RegisterType;
import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableKill;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
+import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
- * @author Mathael
+ * Brothers Bound in Chains (500)
+ * @author Mathael, Mobius
* @URL https://l2wiki.com/Brothers_Bound_in_Chains
- * @version Infinite Odyssey
*/
public class Q00500_BrothersBoundInChains extends Quest
{
@@ -47,26 +47,12 @@ public class Q00500_BrothersBoundInChains extends Quest
private static final int GEMSTONE_B = 2132;
private static final int PENITENT_MANACLES = 36060;
private static final int CRUMBS_OF_PENITENCE = 36077;
- // Skills
- private static final int HOUR_OF_PENITENCE[] =
- {
- 15325,
- 15326,
- 15327,
- 15328,
- 15329
- };
- // Agathions
- private static final int SIN_EATERS[] =
- {
- 16098,
- 16099,
- 16100,
- 16101,
- 16102
- };
- // Misc
- private static final int DROP_QI_CHANCE = 5; // in % TODO: check that value
+ // Skill
+ private static final int HOUR_OF_PENITENCE = 15325;
+ // Agathion
+ private static final int SIN_EATER = 16098;
+ // Others
+ private static final int DROP_QI_CHANCE = 5;
private static final int MIN_LEVEL = 85;
public Q00500_BrothersBoundInChains()
@@ -74,9 +60,11 @@ public class Q00500_BrothersBoundInChains extends Quest
super(500);
addStartNpc(DARK_JUDGE);
addTalkId(DARK_JUDGE);
- addSummonAgathion();
registerQuestItems(PENITENT_MANACLES, CRUMBS_OF_PENITENCE);
addCondMinLevel(MIN_LEVEL, "30981-nopk.htm");
+
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_SUMMON_AGATHION, (OnPlayerSummonAgathion event) -> OnPlayerSummonAgathion(event), this));
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_UNSUMMON_AGATHION, (OnPlayerUnsummonAgathion event) -> OnPlayerUnsummonAgathion(event), this));
}
@Override
@@ -92,9 +80,9 @@ public class Q00500_BrothersBoundInChains extends Quest
{
case "buff":
{
- if (player != null)
+ if ((player != null) && (player.getAgathionId() == SIN_EATER))
{
- final Skill skill = SkillData.getInstance().getSkill(15325, 1); // Hour of Penitence
+ final Skill skill = SkillData.getInstance().getSkill(HOUR_OF_PENITENCE, 1); // Hour of Penitence
skill.activateSkill(player, player);
startQuestTimer("buff", 270000, null, player); // Rebuff every 4min30 (retail like)
}
@@ -128,7 +116,7 @@ public class Q00500_BrothersBoundInChains extends Quest
if (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10)
{
takeItems(player, CRUMBS_OF_PENITENCE, -1);
- player.setPkKills(Math.max(0, player.getPkKills() - Rnd.get(1, 10)));
+ player.setPkKills(Math.max(0, player.getPkKills() - getRandom(1, 10)));
qs.exitQuest(QuestType.DAILY, true);
}
else
@@ -192,45 +180,66 @@ public class Q00500_BrothersBoundInChains extends Quest
return htmltext;
}
- @Override
- public void onSummonAgathion(L2PcInstance player, int agathionId)
+ private void OnPlayerSummonAgathion(OnPlayerSummonAgathion event)
{
- if (IntStream.of(SIN_EATERS).anyMatch(x -> x == agathionId)) // TODO: Register IDs
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
{
startQuestTimer("buff", 2500, null, player);
}
}
+ private void OnPlayerUnsummonAgathion(OnPlayerUnsummonAgathion event)
+ {
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
+ {
+ cancelQuestTimer("buff", null, player);
+ player.getEffectList().stopSkillEffects(true, HOUR_OF_PENITENCE);
+ }
+ }
+
@RegisterEvent(EventType.ON_ATTACKABLE_KILL)
@RegisterType(ListenerRegisterType.GLOBAL_MONSTERS)
public void onAttackableKill(OnAttackableKill event)
{
- final QuestState qs = getQuestState(event.getAttacker(), false);
+ final L2PcInstance player = event.getAttacker();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return;
}
- // Player can drop more than 10 Crumbs of Penitence but there's no point in getting more than 10 (retail)
- boolean isAffectedByHourOfPenitence = false;
- final CharEffectList effects = event.getAttacker().getEffectList();
- for (int i = 0; !isAffectedByHourOfPenitence && (i < HOUR_OF_PENITENCE.length); i++)
+ if (player.getEffectList().isAffectedBySkill(HOUR_OF_PENITENCE) && (getRandom(100) < DROP_QI_CHANCE))
{
- if (effects.isAffectedBySkill(HOUR_OF_PENITENCE[i]))
+ giveItems(player, CRUMBS_OF_PENITENCE, 1);
+ if (!qs.isCond(2) && (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 10))
{
- isAffectedByHourOfPenitence = true;
- }
- }
-
- if (isAffectedByHourOfPenitence)
- {
- if (Rnd.get(1, 100) <= DROP_QI_CHANCE)
- {
- giveItems(event.getAttacker(), CRUMBS_OF_PENITENCE, 1);
- if (!qs.isCond(2) && (getQuestItemsCount(event.getAttacker(), CRUMBS_OF_PENITENCE) >= 10))
- {
- qs.setCond(2, true);
- }
+ qs.setCond(2, true);
}
}
}
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/items/36000-36099.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/items/36000-36099.xml
index d1e64d217b..e486bd1125 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/items/36000-36099.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/items/36000-36099.xml
@@ -1282,6 +1282,7 @@
+
diff --git a/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
index 5eead0123d..de0b88363e 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
@@ -101,7 +101,6 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogou
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionCancel;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
-import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
@@ -1507,13 +1506,6 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
return registerConsumer(callback, EventType.ON_INSTANCE_STATUS_CHANGE, ListenerRegisterType.INSTANCE, templateIds);
}
- // ---------------------------------------------------------------------------------------------------------------------------
-
- protected final List setPlayerSummonAgathion(Consumer callback)
- {
- return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_AGATHION, ListenerRegisterType.GLOBAL);
- }
-
// --------------------------------------------------------------------------------------------------
// --------------------------------Default listener register methods---------------------------------
// --------------------------------------------------------------------------------------------------
diff --git a/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/EventType.java
index 8e7fae6586..971e86f681 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/EventType.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/EventType.java
@@ -111,6 +111,7 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummo
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerTransform;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarFinish;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarStart;
@@ -272,6 +273,7 @@ public enum EventType
ON_PLAYER_QUEST_ABORT(OnPlayerQuestAbort.class, void.class),
ON_PLAYER_QUEST_COMPLETE(OnPlayerQuestComplete.class, void.class),
ON_PLAYER_SUMMON_AGATHION(OnPlayerSummonAgathion.class, void.class),
+ ON_PLAYER_UNSUMMON_AGATHION(OnPlayerUnsummonAgathion.class, void.class),
// Trap events
ON_TRAP_ACTION(OnTrapAction.class, void.class),
diff --git a/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
new file mode 100644
index 0000000000..22ea428fc9
--- /dev/null
+++ b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 3 of the License, 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, see .
+ */
+package com.l2jmobius.gameserver.model.events.impl.character.player;
+
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.EventType;
+import com.l2jmobius.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author Mobius
+ */
+public class OnPlayerUnsummonAgathion implements IBaseEvent
+{
+ private final L2PcInstance _player;
+ private final int _agathionId;
+
+ public OnPlayerUnsummonAgathion(L2PcInstance player, int agathionId)
+ {
+ _player = player;
+ _agathionId = agathionId;
+ }
+
+ public L2PcInstance getPlayer()
+ {
+ return _player;
+ }
+
+ public int getAgathionId()
+ {
+ return _agathionId;
+ }
+
+ @Override
+ public EventType getType()
+ {
+ return EventType.ON_PLAYER_UNSUMMON_AGATHION;
+ }
+}
diff --git a/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/quest/Quest.java b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/quest/Quest.java
index 49f17ec208..221fc3baca 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/quest/Quest.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/com/l2jmobius/gameserver/model/quest/Quest.java
@@ -1002,19 +1002,6 @@ public class Quest extends AbstractScript implements IIdentifiable
return false;
}
- public final void notifySummonAgathion(L2PcInstance player, int npcId)
- {
- try
- {
- onSummonAgathion(player, npcId);
- }
- catch (Exception e)
- {
- LOGGER.log(Level.WARNING, "Exception on onSummonAgathion() in notifySummonAgathion(): " + e.getMessage(), e);
- return;
- }
- }
-
// These are methods that java calls to invoke scripts.
/**
@@ -1497,10 +1484,6 @@ public class Quest extends AbstractScript implements IIdentifiable
{
}
- public void onSummonAgathion(L2PcInstance player, int agathionId)
- {
- }
-
/**
* @param npc
* @param player
@@ -2415,11 +2398,6 @@ public class Quest extends AbstractScript implements IIdentifiable
setInstanceLeaveId(event -> onInstanceLeave(event.getPlayer(), event.getInstanceWorld()), templateIds);
}
- public void addSummonAgathion()
- {
- setPlayerSummonAgathion(event -> notifySummonAgathion(event.getPlayer(), event.getAgathionId()));
- }
-
/**
* Use this method to get a random party member from a player's party.
* Useful when distributing rewards after killing an NPC.
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
index c73eb71458..f2d6f1b9c1 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
@@ -64,6 +64,6 @@ public final class SummonAgathion extends AbstractEffect
player.sendPacket(new ExUserInfoCubic(player));
player.broadcastCharInfo();
- EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(effector.getActingPlayer(), _npcId));
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(player, _npcId));
}
}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
index abe6556524..b40b18f77f 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
@@ -20,6 +20,8 @@ import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.events.EventDispatcher;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
@@ -46,9 +48,15 @@ public final class UnsummonAgathion extends AbstractEffect
final L2PcInstance player = effector.getActingPlayer();
if (player != null)
{
- player.setAgathionId(0);
- player.sendPacket(new ExUserInfoCubic(player));
- player.broadcastCharInfo();
+ final int agathionId = player.getAgathionId();
+ if (agathionId > 0)
+ {
+ player.setAgathionId(0);
+ player.sendPacket(new ExUserInfoCubic(player));
+ player.broadcastCharInfo();
+
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerUnsummonAgathion(player, agathionId));
+ }
}
}
}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
index a8702bd970..40a5bd3557 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
@@ -99,7 +99,6 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogou
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionCancel;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
-import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
@@ -1481,13 +1480,6 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
return registerConsumer(callback, EventType.ON_INSTANCE_STATUS_CHANGE, ListenerRegisterType.INSTANCE, templateIds);
}
- // ---------------------------------------------------------------------------------------------------------------------------
-
- protected final List setPlayerSummonAgathion(Consumer callback)
- {
- return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_AGATHION, ListenerRegisterType.GLOBAL);
- }
-
// --------------------------------------------------------------------------------------------------
// --------------------------------Default listener register methods---------------------------------
// --------------------------------------------------------------------------------------------------
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/EventType.java
index 77ae06a6af..a414e96baf 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/EventType.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/EventType.java
@@ -110,6 +110,7 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummo
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerTransform;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarFinish;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarStart;
@@ -270,6 +271,7 @@ public enum EventType
ON_PLAYER_QUEST_ABORT(OnPlayerQuestAbort.class, void.class),
ON_PLAYER_QUEST_COMPLETE(OnPlayerQuestComplete.class, void.class),
ON_PLAYER_SUMMON_AGATHION(OnPlayerSummonAgathion.class, void.class),
+ ON_PLAYER_UNSUMMON_AGATHION(OnPlayerUnsummonAgathion.class, void.class),
// Trap events
ON_TRAP_ACTION(OnTrapAction.class, void.class),
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
new file mode 100644
index 0000000000..22ea428fc9
--- /dev/null
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 3 of the License, 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, see .
+ */
+package com.l2jmobius.gameserver.model.events.impl.character.player;
+
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.EventType;
+import com.l2jmobius.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author Mobius
+ */
+public class OnPlayerUnsummonAgathion implements IBaseEvent
+{
+ private final L2PcInstance _player;
+ private final int _agathionId;
+
+ public OnPlayerUnsummonAgathion(L2PcInstance player, int agathionId)
+ {
+ _player = player;
+ _agathionId = agathionId;
+ }
+
+ public L2PcInstance getPlayer()
+ {
+ return _player;
+ }
+
+ public int getAgathionId()
+ {
+ return _agathionId;
+ }
+
+ @Override
+ public EventType getType()
+ {
+ return EventType.ON_PLAYER_UNSUMMON_AGATHION;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/quest/Quest.java b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/quest/Quest.java
index edb837c8bd..463829ac7f 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/quest/Quest.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/model/quest/Quest.java
@@ -986,19 +986,6 @@ public class Quest extends AbstractScript implements IIdentifiable
return false;
}
- public final void notifySummonAgathion(L2PcInstance player, int npcId)
- {
- try
- {
- onSummonAgathion(player, npcId);
- }
- catch (Exception e)
- {
- LOGGER.log(Level.WARNING, "Exception on onSummonAgathion() in notifySummonAgathion(): " + e.getMessage(), e);
- return;
- }
- }
-
// These are methods that java calls to invoke scripts.
/**
@@ -1473,10 +1460,6 @@ public class Quest extends AbstractScript implements IIdentifiable
{
}
- public void onSummonAgathion(L2PcInstance player, int agathionId)
- {
- }
-
/**
* @param npc
* @param player
@@ -2373,11 +2356,6 @@ public class Quest extends AbstractScript implements IIdentifiable
setInstanceLeaveId(event -> onInstanceLeave(event.getPlayer(), event.getInstanceWorld()), templateIds);
}
- public void addSummonAgathion()
- {
- setPlayerSummonAgathion(event -> notifySummonAgathion(event.getPlayer(), event.getAgathionId()));
- }
-
/**
* Use this method to get a random party member from a player's party.
* Useful when distributing rewards after killing an NPC.
diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
index c73eb71458..f2d6f1b9c1 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
@@ -64,6 +64,6 @@ public final class SummonAgathion extends AbstractEffect
player.sendPacket(new ExUserInfoCubic(player));
player.broadcastCharInfo();
- EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(effector.getActingPlayer(), _npcId));
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(player, _npcId));
}
}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
index abe6556524..b40b18f77f 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
@@ -20,6 +20,8 @@ import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.events.EventDispatcher;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
@@ -46,9 +48,15 @@ public final class UnsummonAgathion extends AbstractEffect
final L2PcInstance player = effector.getActingPlayer();
if (player != null)
{
- player.setAgathionId(0);
- player.sendPacket(new ExUserInfoCubic(player));
- player.broadcastCharInfo();
+ final int agathionId = player.getAgathionId();
+ if (agathionId > 0)
+ {
+ player.setAgathionId(0);
+ player.sendPacket(new ExUserInfoCubic(player));
+ player.broadcastCharInfo();
+
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerUnsummonAgathion(player, agathionId));
+ }
}
}
}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
index 75a90dfd5a..a525c40c89 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
@@ -16,23 +16,27 @@
*/
package quests.Q00500_BrothersBoundInChains;
-import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.enums.QuestType;
import com.l2jmobius.gameserver.model.actor.L2Attackable;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.Containers;
import com.l2jmobius.gameserver.model.events.EventType;
import com.l2jmobius.gameserver.model.events.ListenerRegisterType;
import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import com.l2jmobius.gameserver.model.events.annotations.RegisterType;
import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableKill;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
+import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
+ * Brothers Bound in Chains (500)
* @author Mobius (Based on GoD quest.)
* @URL https://l2wiki.com/classic/Brothers_Bound_in_Chains
*/
@@ -45,7 +49,7 @@ public class Q00500_BrothersBoundInChains extends Quest
private static final int PENITENT_MANACLES = 70806;
private static final int CRUMBS_OF_PENITENCE = 70807;
// Skill
- private static final int HOUR_OF_PENITENCE = 15325;
+ private static final int HOUR_OF_PENITENCE = 55702;
// Agathion
private static final int SIN_EATER = 9021;
// Other
@@ -56,8 +60,10 @@ public class Q00500_BrothersBoundInChains extends Quest
super(500);
addStartNpc(DARK_JUDGE);
addTalkId(DARK_JUDGE);
- addSummonAgathion();
registerQuestItems(PENITENT_MANACLES, CRUMBS_OF_PENITENCE);
+
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_SUMMON_AGATHION, (OnPlayerSummonAgathion event) -> OnPlayerSummonAgathion(event), this));
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_UNSUMMON_AGATHION, (OnPlayerUnsummonAgathion event) -> OnPlayerUnsummonAgathion(event), this));
}
@Override
@@ -73,7 +79,7 @@ public class Q00500_BrothersBoundInChains extends Quest
{
case "buff":
{
- if (player != null)
+ if ((player != null) && (player.getAgathionId() == SIN_EATER))
{
final Skill skill = SkillData.getInstance().getSkill(HOUR_OF_PENITENCE, 1); // Hour of Penitence
skill.activateSkill(player, player);
@@ -109,7 +115,8 @@ public class Q00500_BrothersBoundInChains extends Quest
if (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 35)
{
takeItems(player, CRUMBS_OF_PENITENCE, -1);
- player.setPkKills(Math.max(0, player.getPkKills() - Rnd.get(1, 3)));
+ takeItems(player, PENITENT_MANACLES, -1);
+ player.setPkKills(Math.max(0, player.getPkKills() - getRandom(1, 3)));
qs.unset(KILL_COUNT_VAR);
qs.exitQuest(QuestType.DAILY, true);
}
@@ -174,15 +181,45 @@ public class Q00500_BrothersBoundInChains extends Quest
return htmltext;
}
- @Override
- public void onSummonAgathion(L2PcInstance player, int agathionId)
+ private void OnPlayerSummonAgathion(OnPlayerSummonAgathion event)
{
- if (SIN_EATER == agathionId)
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
{
startQuestTimer("buff", 2500, null, player);
}
}
+ private void OnPlayerUnsummonAgathion(OnPlayerUnsummonAgathion event)
+ {
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
+ {
+ cancelQuestTimer("buff", null, player);
+ player.getEffectList().stopSkillEffects(true, HOUR_OF_PENITENCE);
+ }
+ }
+
@RegisterEvent(EventType.ON_ATTACKABLE_KILL)
@RegisterType(ListenerRegisterType.GLOBAL_MONSTERS)
public void onAttackableKill(OnAttackableKill event)
diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/items/70800-70899.xml b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/items/70800-70899.xml
index ff95b58a18..4f9b87f519 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/items/70800-70899.xml
+++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/stats/items/70800-70899.xml
@@ -76,6 +76,7 @@
+
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
index a8702bd970..40a5bd3557 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
@@ -99,7 +99,6 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogou
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionCancel;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
-import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
@@ -1481,13 +1480,6 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
return registerConsumer(callback, EventType.ON_INSTANCE_STATUS_CHANGE, ListenerRegisterType.INSTANCE, templateIds);
}
- // ---------------------------------------------------------------------------------------------------------------------------
-
- protected final List setPlayerSummonAgathion(Consumer callback)
- {
- return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_AGATHION, ListenerRegisterType.GLOBAL);
- }
-
// --------------------------------------------------------------------------------------------------
// --------------------------------Default listener register methods---------------------------------
// --------------------------------------------------------------------------------------------------
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/EventType.java
index 77ae06a6af..a414e96baf 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/EventType.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/EventType.java
@@ -110,6 +110,7 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummo
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerTransform;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarFinish;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarStart;
@@ -270,6 +271,7 @@ public enum EventType
ON_PLAYER_QUEST_ABORT(OnPlayerQuestAbort.class, void.class),
ON_PLAYER_QUEST_COMPLETE(OnPlayerQuestComplete.class, void.class),
ON_PLAYER_SUMMON_AGATHION(OnPlayerSummonAgathion.class, void.class),
+ ON_PLAYER_UNSUMMON_AGATHION(OnPlayerUnsummonAgathion.class, void.class),
// Trap events
ON_TRAP_ACTION(OnTrapAction.class, void.class),
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
new file mode 100644
index 0000000000..22ea428fc9
--- /dev/null
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 3 of the License, 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, see .
+ */
+package com.l2jmobius.gameserver.model.events.impl.character.player;
+
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.EventType;
+import com.l2jmobius.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author Mobius
+ */
+public class OnPlayerUnsummonAgathion implements IBaseEvent
+{
+ private final L2PcInstance _player;
+ private final int _agathionId;
+
+ public OnPlayerUnsummonAgathion(L2PcInstance player, int agathionId)
+ {
+ _player = player;
+ _agathionId = agathionId;
+ }
+
+ public L2PcInstance getPlayer()
+ {
+ return _player;
+ }
+
+ public int getAgathionId()
+ {
+ return _agathionId;
+ }
+
+ @Override
+ public EventType getType()
+ {
+ return EventType.ON_PLAYER_UNSUMMON_AGATHION;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/quest/Quest.java b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/quest/Quest.java
index edb837c8bd..463829ac7f 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/quest/Quest.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/model/quest/Quest.java
@@ -986,19 +986,6 @@ public class Quest extends AbstractScript implements IIdentifiable
return false;
}
- public final void notifySummonAgathion(L2PcInstance player, int npcId)
- {
- try
- {
- onSummonAgathion(player, npcId);
- }
- catch (Exception e)
- {
- LOGGER.log(Level.WARNING, "Exception on onSummonAgathion() in notifySummonAgathion(): " + e.getMessage(), e);
- return;
- }
- }
-
// These are methods that java calls to invoke scripts.
/**
@@ -1473,10 +1460,6 @@ public class Quest extends AbstractScript implements IIdentifiable
{
}
- public void onSummonAgathion(L2PcInstance player, int agathionId)
- {
- }
-
/**
* @param npc
* @param player
@@ -2373,11 +2356,6 @@ public class Quest extends AbstractScript implements IIdentifiable
setInstanceLeaveId(event -> onInstanceLeave(event.getPlayer(), event.getInstanceWorld()), templateIds);
}
- public void addSummonAgathion()
- {
- setPlayerSummonAgathion(event -> notifySummonAgathion(event.getPlayer(), event.getAgathionId()));
- }
-
/**
* Use this method to get a random party member from a player's party.
* Useful when distributing rewards after killing an NPC.
diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
index c73eb71458..f2d6f1b9c1 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
@@ -64,6 +64,6 @@ public final class SummonAgathion extends AbstractEffect
player.sendPacket(new ExUserInfoCubic(player));
player.broadcastCharInfo();
- EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(effector.getActingPlayer(), _npcId));
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(player, _npcId));
}
}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
index abe6556524..b40b18f77f 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
@@ -20,6 +20,8 @@ import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.events.EventDispatcher;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
@@ -46,9 +48,15 @@ public final class UnsummonAgathion extends AbstractEffect
final L2PcInstance player = effector.getActingPlayer();
if (player != null)
{
- player.setAgathionId(0);
- player.sendPacket(new ExUserInfoCubic(player));
- player.broadcastCharInfo();
+ final int agathionId = player.getAgathionId();
+ if (agathionId > 0)
+ {
+ player.setAgathionId(0);
+ player.sendPacket(new ExUserInfoCubic(player));
+ player.broadcastCharInfo();
+
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerUnsummonAgathion(player, agathionId));
+ }
}
}
}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
index 75a90dfd5a..a525c40c89 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
@@ -16,23 +16,27 @@
*/
package quests.Q00500_BrothersBoundInChains;
-import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.enums.QuestType;
import com.l2jmobius.gameserver.model.actor.L2Attackable;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.Containers;
import com.l2jmobius.gameserver.model.events.EventType;
import com.l2jmobius.gameserver.model.events.ListenerRegisterType;
import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import com.l2jmobius.gameserver.model.events.annotations.RegisterType;
import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableKill;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
+import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
+ * Brothers Bound in Chains (500)
* @author Mobius (Based on GoD quest.)
* @URL https://l2wiki.com/classic/Brothers_Bound_in_Chains
*/
@@ -45,7 +49,7 @@ public class Q00500_BrothersBoundInChains extends Quest
private static final int PENITENT_MANACLES = 70806;
private static final int CRUMBS_OF_PENITENCE = 70807;
// Skill
- private static final int HOUR_OF_PENITENCE = 15325;
+ private static final int HOUR_OF_PENITENCE = 55702;
// Agathion
private static final int SIN_EATER = 9021;
// Other
@@ -56,8 +60,10 @@ public class Q00500_BrothersBoundInChains extends Quest
super(500);
addStartNpc(DARK_JUDGE);
addTalkId(DARK_JUDGE);
- addSummonAgathion();
registerQuestItems(PENITENT_MANACLES, CRUMBS_OF_PENITENCE);
+
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_SUMMON_AGATHION, (OnPlayerSummonAgathion event) -> OnPlayerSummonAgathion(event), this));
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_UNSUMMON_AGATHION, (OnPlayerUnsummonAgathion event) -> OnPlayerUnsummonAgathion(event), this));
}
@Override
@@ -73,7 +79,7 @@ public class Q00500_BrothersBoundInChains extends Quest
{
case "buff":
{
- if (player != null)
+ if ((player != null) && (player.getAgathionId() == SIN_EATER))
{
final Skill skill = SkillData.getInstance().getSkill(HOUR_OF_PENITENCE, 1); // Hour of Penitence
skill.activateSkill(player, player);
@@ -109,7 +115,8 @@ public class Q00500_BrothersBoundInChains extends Quest
if (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 35)
{
takeItems(player, CRUMBS_OF_PENITENCE, -1);
- player.setPkKills(Math.max(0, player.getPkKills() - Rnd.get(1, 3)));
+ takeItems(player, PENITENT_MANACLES, -1);
+ player.setPkKills(Math.max(0, player.getPkKills() - getRandom(1, 3)));
qs.unset(KILL_COUNT_VAR);
qs.exitQuest(QuestType.DAILY, true);
}
@@ -174,15 +181,45 @@ public class Q00500_BrothersBoundInChains extends Quest
return htmltext;
}
- @Override
- public void onSummonAgathion(L2PcInstance player, int agathionId)
+ private void OnPlayerSummonAgathion(OnPlayerSummonAgathion event)
{
- if (SIN_EATER == agathionId)
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
{
startQuestTimer("buff", 2500, null, player);
}
}
+ private void OnPlayerUnsummonAgathion(OnPlayerUnsummonAgathion event)
+ {
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
+ {
+ cancelQuestTimer("buff", null, player);
+ player.getEffectList().stopSkillEffects(true, HOUR_OF_PENITENCE);
+ }
+ }
+
@RegisterEvent(EventType.ON_ATTACKABLE_KILL)
@RegisterType(ListenerRegisterType.GLOBAL_MONSTERS)
public void onAttackableKill(OnAttackableKill event)
diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/items/70800-70899.xml b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/items/70800-70899.xml
index c184cff468..235efa7ed1 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/items/70800-70899.xml
+++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/stats/items/70800-70899.xml
@@ -76,6 +76,7 @@
+
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
index a8702bd970..40a5bd3557 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
@@ -99,7 +99,6 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogou
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionCancel;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
-import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
@@ -1481,13 +1480,6 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
return registerConsumer(callback, EventType.ON_INSTANCE_STATUS_CHANGE, ListenerRegisterType.INSTANCE, templateIds);
}
- // ---------------------------------------------------------------------------------------------------------------------------
-
- protected final List setPlayerSummonAgathion(Consumer callback)
- {
- return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_AGATHION, ListenerRegisterType.GLOBAL);
- }
-
// --------------------------------------------------------------------------------------------------
// --------------------------------Default listener register methods---------------------------------
// --------------------------------------------------------------------------------------------------
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/EventType.java
index 77ae06a6af..a414e96baf 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/EventType.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/EventType.java
@@ -110,6 +110,7 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummo
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerTransform;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarFinish;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarStart;
@@ -270,6 +271,7 @@ public enum EventType
ON_PLAYER_QUEST_ABORT(OnPlayerQuestAbort.class, void.class),
ON_PLAYER_QUEST_COMPLETE(OnPlayerQuestComplete.class, void.class),
ON_PLAYER_SUMMON_AGATHION(OnPlayerSummonAgathion.class, void.class),
+ ON_PLAYER_UNSUMMON_AGATHION(OnPlayerUnsummonAgathion.class, void.class),
// Trap events
ON_TRAP_ACTION(OnTrapAction.class, void.class),
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
new file mode 100644
index 0000000000..22ea428fc9
--- /dev/null
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 3 of the License, 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, see .
+ */
+package com.l2jmobius.gameserver.model.events.impl.character.player;
+
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.EventType;
+import com.l2jmobius.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author Mobius
+ */
+public class OnPlayerUnsummonAgathion implements IBaseEvent
+{
+ private final L2PcInstance _player;
+ private final int _agathionId;
+
+ public OnPlayerUnsummonAgathion(L2PcInstance player, int agathionId)
+ {
+ _player = player;
+ _agathionId = agathionId;
+ }
+
+ public L2PcInstance getPlayer()
+ {
+ return _player;
+ }
+
+ public int getAgathionId()
+ {
+ return _agathionId;
+ }
+
+ @Override
+ public EventType getType()
+ {
+ return EventType.ON_PLAYER_UNSUMMON_AGATHION;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/quest/Quest.java b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/quest/Quest.java
index edb837c8bd..463829ac7f 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/quest/Quest.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/model/quest/Quest.java
@@ -986,19 +986,6 @@ public class Quest extends AbstractScript implements IIdentifiable
return false;
}
- public final void notifySummonAgathion(L2PcInstance player, int npcId)
- {
- try
- {
- onSummonAgathion(player, npcId);
- }
- catch (Exception e)
- {
- LOGGER.log(Level.WARNING, "Exception on onSummonAgathion() in notifySummonAgathion(): " + e.getMessage(), e);
- return;
- }
- }
-
// These are methods that java calls to invoke scripts.
/**
@@ -1473,10 +1460,6 @@ public class Quest extends AbstractScript implements IIdentifiable
{
}
- public void onSummonAgathion(L2PcInstance player, int agathionId)
- {
- }
-
/**
* @param npc
* @param player
@@ -2373,11 +2356,6 @@ public class Quest extends AbstractScript implements IIdentifiable
setInstanceLeaveId(event -> onInstanceLeave(event.getPlayer(), event.getInstanceWorld()), templateIds);
}
- public void addSummonAgathion()
- {
- setPlayerSummonAgathion(event -> notifySummonAgathion(event.getPlayer(), event.getAgathionId()));
- }
-
/**
* Use this method to get a random party member from a player's party.
* Useful when distributing rewards after killing an NPC.
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
index c73eb71458..f2d6f1b9c1 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/SummonAgathion.java
@@ -64,6 +64,6 @@ public final class SummonAgathion extends AbstractEffect
player.sendPacket(new ExUserInfoCubic(player));
player.broadcastCharInfo();
- EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(effector.getActingPlayer(), _npcId));
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSummonAgathion(player, _npcId));
}
}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
index abe6556524..b40b18f77f 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/UnsummonAgathion.java
@@ -20,6 +20,8 @@ import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.effects.AbstractEffect;
+import com.l2jmobius.gameserver.model.events.EventDispatcher;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
@@ -46,9 +48,15 @@ public final class UnsummonAgathion extends AbstractEffect
final L2PcInstance player = effector.getActingPlayer();
if (player != null)
{
- player.setAgathionId(0);
- player.sendPacket(new ExUserInfoCubic(player));
- player.broadcastCharInfo();
+ final int agathionId = player.getAgathionId();
+ if (agathionId > 0)
+ {
+ player.setAgathionId(0);
+ player.sendPacket(new ExUserInfoCubic(player));
+ player.broadcastCharInfo();
+
+ EventDispatcher.getInstance().notifyEventAsync(new OnPlayerUnsummonAgathion(player, agathionId));
+ }
}
}
}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
index 75a90dfd5a..a525c40c89 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/quests/Q00500_BrothersBoundInChains/Q00500_BrothersBoundInChains.java
@@ -16,23 +16,27 @@
*/
package quests.Q00500_BrothersBoundInChains;
-import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.enums.QuestType;
import com.l2jmobius.gameserver.model.actor.L2Attackable;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.Containers;
import com.l2jmobius.gameserver.model.events.EventType;
import com.l2jmobius.gameserver.model.events.ListenerRegisterType;
import com.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import com.l2jmobius.gameserver.model.events.annotations.RegisterType;
import com.l2jmobius.gameserver.model.events.impl.character.npc.OnAttackableKill;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
+import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.model.skills.Skill;
/**
+ * Brothers Bound in Chains (500)
* @author Mobius (Based on GoD quest.)
* @URL https://l2wiki.com/classic/Brothers_Bound_in_Chains
*/
@@ -45,7 +49,7 @@ public class Q00500_BrothersBoundInChains extends Quest
private static final int PENITENT_MANACLES = 70806;
private static final int CRUMBS_OF_PENITENCE = 70807;
// Skill
- private static final int HOUR_OF_PENITENCE = 15325;
+ private static final int HOUR_OF_PENITENCE = 55702;
// Agathion
private static final int SIN_EATER = 9021;
// Other
@@ -56,8 +60,10 @@ public class Q00500_BrothersBoundInChains extends Quest
super(500);
addStartNpc(DARK_JUDGE);
addTalkId(DARK_JUDGE);
- addSummonAgathion();
registerQuestItems(PENITENT_MANACLES, CRUMBS_OF_PENITENCE);
+
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_SUMMON_AGATHION, (OnPlayerSummonAgathion event) -> OnPlayerSummonAgathion(event), this));
+ Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_UNSUMMON_AGATHION, (OnPlayerUnsummonAgathion event) -> OnPlayerUnsummonAgathion(event), this));
}
@Override
@@ -73,7 +79,7 @@ public class Q00500_BrothersBoundInChains extends Quest
{
case "buff":
{
- if (player != null)
+ if ((player != null) && (player.getAgathionId() == SIN_EATER))
{
final Skill skill = SkillData.getInstance().getSkill(HOUR_OF_PENITENCE, 1); // Hour of Penitence
skill.activateSkill(player, player);
@@ -109,7 +115,8 @@ public class Q00500_BrothersBoundInChains extends Quest
if (getQuestItemsCount(player, CRUMBS_OF_PENITENCE) >= 35)
{
takeItems(player, CRUMBS_OF_PENITENCE, -1);
- player.setPkKills(Math.max(0, player.getPkKills() - Rnd.get(1, 3)));
+ takeItems(player, PENITENT_MANACLES, -1);
+ player.setPkKills(Math.max(0, player.getPkKills() - getRandom(1, 3)));
qs.unset(KILL_COUNT_VAR);
qs.exitQuest(QuestType.DAILY, true);
}
@@ -174,15 +181,45 @@ public class Q00500_BrothersBoundInChains extends Quest
return htmltext;
}
- @Override
- public void onSummonAgathion(L2PcInstance player, int agathionId)
+ private void OnPlayerSummonAgathion(OnPlayerSummonAgathion event)
{
- if (SIN_EATER == agathionId)
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
{
startQuestTimer("buff", 2500, null, player);
}
}
+ private void OnPlayerUnsummonAgathion(OnPlayerUnsummonAgathion event)
+ {
+ final L2PcInstance player = event.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+ final QuestState qs = getQuestState(player, false);
+ if (qs == null)
+ {
+ return;
+ }
+
+ if (event.getAgathionId() == SIN_EATER)
+ {
+ cancelQuestTimer("buff", null, player);
+ player.getEffectList().stopSkillEffects(true, HOUR_OF_PENITENCE);
+ }
+ }
+
@RegisterEvent(EventType.ON_ATTACKABLE_KILL)
@RegisterType(ListenerRegisterType.GLOBAL_MONSTERS)
public void onAttackableKill(OnAttackableKill event)
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/items/70800-70899.xml b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/items/70800-70899.xml
index 1f83ba7eca..8653ca9b1c 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/items/70800-70899.xml
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/stats/items/70800-70899.xml
@@ -76,6 +76,7 @@
+
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
index a8702bd970..40a5bd3557 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/AbstractScript.java
@@ -99,7 +99,6 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogou
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionCancel;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSkillLearn;
-import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
@@ -1481,13 +1480,6 @@ public abstract class AbstractScript extends ManagedScript implements IEventTime
return registerConsumer(callback, EventType.ON_INSTANCE_STATUS_CHANGE, ListenerRegisterType.INSTANCE, templateIds);
}
- // ---------------------------------------------------------------------------------------------------------------------------
-
- protected final List setPlayerSummonAgathion(Consumer callback)
- {
- return registerConsumer(callback, EventType.ON_PLAYER_SUMMON_AGATHION, ListenerRegisterType.GLOBAL);
- }
-
// --------------------------------------------------------------------------------------------------
// --------------------------------Default listener register methods---------------------------------
// --------------------------------------------------------------------------------------------------
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/EventType.java
index 77ae06a6af..a414e96baf 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/EventType.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/EventType.java
@@ -110,6 +110,7 @@ import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummo
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonSpawn;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerSummonTalk;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerTransform;
+import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerUnsummonAgathion;
import com.l2jmobius.gameserver.model.events.impl.character.player.OnTrapAction;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarFinish;
import com.l2jmobius.gameserver.model.events.impl.clan.OnClanWarStart;
@@ -270,6 +271,7 @@ public enum EventType
ON_PLAYER_QUEST_ABORT(OnPlayerQuestAbort.class, void.class),
ON_PLAYER_QUEST_COMPLETE(OnPlayerQuestComplete.class, void.class),
ON_PLAYER_SUMMON_AGATHION(OnPlayerSummonAgathion.class, void.class),
+ ON_PLAYER_UNSUMMON_AGATHION(OnPlayerUnsummonAgathion.class, void.class),
// Trap events
ON_TRAP_ACTION(OnTrapAction.class, void.class),
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
new file mode 100644
index 0000000000..22ea428fc9
--- /dev/null
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/events/impl/character/player/OnPlayerUnsummonAgathion.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * 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 3 of the License, 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, see .
+ */
+package com.l2jmobius.gameserver.model.events.impl.character.player;
+
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.events.EventType;
+import com.l2jmobius.gameserver.model.events.impl.IBaseEvent;
+
+/**
+ * @author Mobius
+ */
+public class OnPlayerUnsummonAgathion implements IBaseEvent
+{
+ private final L2PcInstance _player;
+ private final int _agathionId;
+
+ public OnPlayerUnsummonAgathion(L2PcInstance player, int agathionId)
+ {
+ _player = player;
+ _agathionId = agathionId;
+ }
+
+ public L2PcInstance getPlayer()
+ {
+ return _player;
+ }
+
+ public int getAgathionId()
+ {
+ return _agathionId;
+ }
+
+ @Override
+ public EventType getType()
+ {
+ return EventType.ON_PLAYER_UNSUMMON_AGATHION;
+ }
+}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/quest/Quest.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/quest/Quest.java
index edb837c8bd..463829ac7f 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/quest/Quest.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/com/l2jmobius/gameserver/model/quest/Quest.java
@@ -986,19 +986,6 @@ public class Quest extends AbstractScript implements IIdentifiable
return false;
}
- public final void notifySummonAgathion(L2PcInstance player, int npcId)
- {
- try
- {
- onSummonAgathion(player, npcId);
- }
- catch (Exception e)
- {
- LOGGER.log(Level.WARNING, "Exception on onSummonAgathion() in notifySummonAgathion(): " + e.getMessage(), e);
- return;
- }
- }
-
// These are methods that java calls to invoke scripts.
/**
@@ -1473,10 +1460,6 @@ public class Quest extends AbstractScript implements IIdentifiable
{
}
- public void onSummonAgathion(L2PcInstance player, int agathionId)
- {
- }
-
/**
* @param npc
* @param player
@@ -2373,11 +2356,6 @@ public class Quest extends AbstractScript implements IIdentifiable
setInstanceLeaveId(event -> onInstanceLeave(event.getPlayer(), event.getInstanceWorld()), templateIds);
}
- public void addSummonAgathion()
- {
- setPlayerSummonAgathion(event -> notifySummonAgathion(event.getPlayer(), event.getAgathionId()));
- }
-
/**
* Use this method to get a random party member from a player's party.
* Useful when distributing rewards after killing an NPC.