From d5b32a2f712a0f5f93d4b2b8f0a63193ceec2dc4 Mon Sep 17 00:00:00 2001
From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com>
Date: Sat, 18 May 2019 12:37:37 +0000
Subject: [PATCH] Addition of monster daily mission handler.
---
.../handlers/DailyMissionMasterHandler.java | 2 +
.../MonsterDailyMissionHandler.java | 141 ++++++++++
.../ExOneDayReceiveRewardList.java | 5 +-
.../dist/game/data/DailyMission.xml | 265 +++++++++++++++++-
.../handlers/DailyMissionMasterHandler.java | 2 +
.../MonsterDailyMissionHandler.java | 141 ++++++++++
.../ExOneDayReceiveRewardList.java | 5 +-
7 files changed, 554 insertions(+), 7 deletions(-)
create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/dailymissionhandlers/MonsterDailyMissionHandler.java
create mode 100644 L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/dailymissionhandlers/MonsterDailyMissionHandler.java
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/DailyMissionMasterHandler.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/DailyMissionMasterHandler.java
index 96cd13cc26..d6889f46bc 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/DailyMissionMasterHandler.java
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/DailyMissionMasterHandler.java
@@ -26,6 +26,7 @@ import handlers.dailymissionhandlers.FishingDailyMissionHandler;
import handlers.dailymissionhandlers.LevelDailyMissionHandler;
import handlers.dailymissionhandlers.LoginMonthDailyMissionHandler;
import handlers.dailymissionhandlers.LoginWeekendDailyMissionHandler;
+import handlers.dailymissionhandlers.MonsterDailyMissionHandler;
import handlers.dailymissionhandlers.OlympiadDailyMissionHandler;
import handlers.dailymissionhandlers.QuestDailyMissionHandler;
import handlers.dailymissionhandlers.SiegeDailyMissionHandler;
@@ -47,6 +48,7 @@ public class DailyMissionMasterHandler
DailyMissionHandler.getInstance().registerHandler("siege", SiegeDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("ceremonyofchaos", CeremonyOfChaosDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("boss", BossDailyMissionHandler::new);
+ DailyMissionHandler.getInstance().registerHandler("monster", MonsterDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("fishing", FishingDailyMissionHandler::new);
LOGGER.info(DailyMissionMasterHandler.class.getSimpleName() + ": Loaded " + DailyMissionHandler.getInstance().size() + " handlers.");
}
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/dailymissionhandlers/MonsterDailyMissionHandler.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/dailymissionhandlers/MonsterDailyMissionHandler.java
new file mode 100644
index 0000000000..08004716cd
--- /dev/null
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/dailymissionhandlers/MonsterDailyMissionHandler.java
@@ -0,0 +1,141 @@
+/*
+ * 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 handlers.dailymissionhandlers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.enums.DailyMissionStatus;
+import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
+import org.l2jmobius.gameserver.model.CommandChannel;
+import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
+import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
+import org.l2jmobius.gameserver.model.Party;
+import org.l2jmobius.gameserver.model.actor.Attackable;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.events.Containers;
+import org.l2jmobius.gameserver.model.events.EventType;
+import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnAttackableKill;
+import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
+
+/**
+ * @author Mobius
+ */
+public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
+{
+ private final int _amount;
+ private final int _minLevel;
+ private final int _maxLevel;
+ private final List _ids = new ArrayList<>();
+
+ public MonsterDailyMissionHandler(DailyMissionDataHolder holder)
+ {
+ super(holder);
+ _amount = holder.getRequiredCompletions();
+ _minLevel = holder.getParams().getInt("minLevel", 0);
+ _maxLevel = holder.getParams().getInt("maxLevel", Byte.MAX_VALUE);
+ final String ids = holder.getParams().getString("ids", "");
+ if (!ids.isEmpty())
+ {
+ for (String s : ids.split(","))
+ {
+ final int id = Integer.parseInt(s);
+ if (!_ids.contains(id))
+ {
+ _ids.add(id);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void init()
+ {
+ Containers.Monsters().addListener(new ConsumerEventListener(this, EventType.ON_ATTACKABLE_KILL, (OnAttackableKill event) -> onAttackableKill(event), this));
+ }
+
+ @Override
+ public boolean isAvailable(PlayerInstance player)
+ {
+ final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), false);
+ if (entry != null)
+ {
+ switch (entry.getStatus())
+ {
+ case NOT_AVAILABLE: // Initial state
+ {
+ if (entry.getProgress() >= _amount)
+ {
+ entry.setStatus(DailyMissionStatus.AVAILABLE);
+ storePlayerEntry(entry);
+ }
+ break;
+ }
+ case AVAILABLE:
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private void onAttackableKill(OnAttackableKill event)
+ {
+ final Attackable monster = event.getTarget();
+ if (!_ids.isEmpty() && !_ids.contains(monster.getId()))
+ {
+ return;
+ }
+
+ final PlayerInstance player = event.getAttacker();
+ if (_minLevel > 0)
+ {
+ final int monsterLevel = monster.getLevel();
+ if ((monsterLevel < _minLevel) || (monsterLevel > _maxLevel) || ((player.getLevel() - monsterLevel) > 5))
+ {
+ return;
+ }
+ }
+
+ final Party party = player.getParty();
+ if (party != null)
+ {
+ final CommandChannel channel = party.getCommandChannel();
+ final List members = channel != null ? channel.getMembers() : party.getMembers();
+ members.stream().filter(member -> member.calculateDistance3D(monster) <= Config.ALT_PARTY_RANGE).forEach(this::processPlayerProgress);
+ }
+ else
+ {
+ processPlayerProgress(player);
+ }
+ }
+
+ private void processPlayerProgress(PlayerInstance player)
+ {
+ final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
+ if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
+ {
+ if (entry.increaseProgress() >= _amount)
+ {
+ entry.setStatus(DailyMissionStatus.AVAILABLE);
+ }
+ storePlayerEntry(entry);
+ }
+ }
+}
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/dailymission/ExOneDayReceiveRewardList.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/dailymission/ExOneDayReceiveRewardList.java
index d07104667a..3f53580346 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/dailymission/ExOneDayReceiveRewardList.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/network/serverpackets/dailymission/ExOneDayReceiveRewardList.java
@@ -71,9 +71,10 @@ public class ExOneDayReceiveRewardList implements IClientOutgoingPacket
for (DailyMissionDataHolder reward : _rewards)
{
packet.writeH(reward.getId());
- packet.writeC(reward.getStatus(_player));
+ int status = reward.getStatus(_player);
+ packet.writeC(status);
packet.writeC(reward.getRequiredCompletions() > 1 ? 0x01 : 0x00);
- packet.writeD(Math.min(reward.getProgress(_player), _player.getLevel()));
+ packet.writeD(reward.getParams().getInt("level", -1) == -1 ? (status == 1 ? 0 : reward.getProgress(_player)) : _player.getLevel());
packet.writeD(reward.getRequiredCompletions());
}
return true;
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/DailyMission.xml b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/DailyMission.xml
index 5a9c46202b..732b8a4791 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/DailyMission.xml
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/DailyMission.xml
@@ -1655,14 +1655,12 @@
-
@@ -1681,4 +1679,265 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+ 24025,24026,24027,24028,24029,24030,24031,24032,24033,24035,24039,24040
+
+
+
+
+
+
+
+ 29022
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 20
+
+
+
+
+
+
+
+ 21
+ 40
+
+
+
+
+
+
+
+ 41
+ 50
+
+
+
+
+
+
+
+ 51
+ 60
+
+
+
+
+
+
+
+ 61
+ 70
+
+
+
+
+
+
+
+ 71
+ 75
+
+
+
+
+
+
+
+ 76
+
+
+
+
+
+
+
+
+ 21733,21734,21735,21736,21742,21743,21744,21745
+
+
+
+
+
+
+
+
+ 20651,20652,20654,20656,20657,20658,24015,24016,24021,24022,20655,20771
+
+
+
+
+
+
+
+
+ 21737,21738,21739,21740,21741,21746,21747,21748,21749,21750,21752,21753
+
+
+
+
+
+
+
+
+ 21869,21870,21871,21876,21877,21878,21879,21888
+
+
+
+
+
+
+
+
+ 21854,21855,81856,21857,21866,21867
+
+
+
+
+
+
+
+
+ 29105
+
+
+
+
+
+
+
+ 29106
+
+
+
+
+
+
+
+ 29107
+
+
+
+
+
+
+
+ 29108
+
+
+
+
+
+
+
+ 85
+
+
+
+
+
+
+
+
+
+
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/DailyMissionMasterHandler.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/DailyMissionMasterHandler.java
index 96cd13cc26..d6889f46bc 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/DailyMissionMasterHandler.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/DailyMissionMasterHandler.java
@@ -26,6 +26,7 @@ import handlers.dailymissionhandlers.FishingDailyMissionHandler;
import handlers.dailymissionhandlers.LevelDailyMissionHandler;
import handlers.dailymissionhandlers.LoginMonthDailyMissionHandler;
import handlers.dailymissionhandlers.LoginWeekendDailyMissionHandler;
+import handlers.dailymissionhandlers.MonsterDailyMissionHandler;
import handlers.dailymissionhandlers.OlympiadDailyMissionHandler;
import handlers.dailymissionhandlers.QuestDailyMissionHandler;
import handlers.dailymissionhandlers.SiegeDailyMissionHandler;
@@ -47,6 +48,7 @@ public class DailyMissionMasterHandler
DailyMissionHandler.getInstance().registerHandler("siege", SiegeDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("ceremonyofchaos", CeremonyOfChaosDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("boss", BossDailyMissionHandler::new);
+ DailyMissionHandler.getInstance().registerHandler("monster", MonsterDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("fishing", FishingDailyMissionHandler::new);
LOGGER.info(DailyMissionMasterHandler.class.getSimpleName() + ": Loaded " + DailyMissionHandler.getInstance().size() + " handlers.");
}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/dailymissionhandlers/MonsterDailyMissionHandler.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/dailymissionhandlers/MonsterDailyMissionHandler.java
new file mode 100644
index 0000000000..08004716cd
--- /dev/null
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/dailymissionhandlers/MonsterDailyMissionHandler.java
@@ -0,0 +1,141 @@
+/*
+ * 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 handlers.dailymissionhandlers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.enums.DailyMissionStatus;
+import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
+import org.l2jmobius.gameserver.model.CommandChannel;
+import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
+import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
+import org.l2jmobius.gameserver.model.Party;
+import org.l2jmobius.gameserver.model.actor.Attackable;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.events.Containers;
+import org.l2jmobius.gameserver.model.events.EventType;
+import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnAttackableKill;
+import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
+
+/**
+ * @author Mobius
+ */
+public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
+{
+ private final int _amount;
+ private final int _minLevel;
+ private final int _maxLevel;
+ private final List _ids = new ArrayList<>();
+
+ public MonsterDailyMissionHandler(DailyMissionDataHolder holder)
+ {
+ super(holder);
+ _amount = holder.getRequiredCompletions();
+ _minLevel = holder.getParams().getInt("minLevel", 0);
+ _maxLevel = holder.getParams().getInt("maxLevel", Byte.MAX_VALUE);
+ final String ids = holder.getParams().getString("ids", "");
+ if (!ids.isEmpty())
+ {
+ for (String s : ids.split(","))
+ {
+ final int id = Integer.parseInt(s);
+ if (!_ids.contains(id))
+ {
+ _ids.add(id);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void init()
+ {
+ Containers.Monsters().addListener(new ConsumerEventListener(this, EventType.ON_ATTACKABLE_KILL, (OnAttackableKill event) -> onAttackableKill(event), this));
+ }
+
+ @Override
+ public boolean isAvailable(PlayerInstance player)
+ {
+ final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), false);
+ if (entry != null)
+ {
+ switch (entry.getStatus())
+ {
+ case NOT_AVAILABLE: // Initial state
+ {
+ if (entry.getProgress() >= _amount)
+ {
+ entry.setStatus(DailyMissionStatus.AVAILABLE);
+ storePlayerEntry(entry);
+ }
+ break;
+ }
+ case AVAILABLE:
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private void onAttackableKill(OnAttackableKill event)
+ {
+ final Attackable monster = event.getTarget();
+ if (!_ids.isEmpty() && !_ids.contains(monster.getId()))
+ {
+ return;
+ }
+
+ final PlayerInstance player = event.getAttacker();
+ if (_minLevel > 0)
+ {
+ final int monsterLevel = monster.getLevel();
+ if ((monsterLevel < _minLevel) || (monsterLevel > _maxLevel) || ((player.getLevel() - monsterLevel) > 5))
+ {
+ return;
+ }
+ }
+
+ final Party party = player.getParty();
+ if (party != null)
+ {
+ final CommandChannel channel = party.getCommandChannel();
+ final List members = channel != null ? channel.getMembers() : party.getMembers();
+ members.stream().filter(member -> member.calculateDistance3D(monster) <= Config.ALT_PARTY_RANGE).forEach(this::processPlayerProgress);
+ }
+ else
+ {
+ processPlayerProgress(player);
+ }
+ }
+
+ private void processPlayerProgress(PlayerInstance player)
+ {
+ final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
+ if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
+ {
+ if (entry.increaseProgress() >= _amount)
+ {
+ entry.setStatus(DailyMissionStatus.AVAILABLE);
+ }
+ storePlayerEntry(entry);
+ }
+ }
+}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/dailymission/ExOneDayReceiveRewardList.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/dailymission/ExOneDayReceiveRewardList.java
index d07104667a..3f53580346 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/dailymission/ExOneDayReceiveRewardList.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/network/serverpackets/dailymission/ExOneDayReceiveRewardList.java
@@ -71,9 +71,10 @@ public class ExOneDayReceiveRewardList implements IClientOutgoingPacket
for (DailyMissionDataHolder reward : _rewards)
{
packet.writeH(reward.getId());
- packet.writeC(reward.getStatus(_player));
+ int status = reward.getStatus(_player);
+ packet.writeC(status);
packet.writeC(reward.getRequiredCompletions() > 1 ? 0x01 : 0x00);
- packet.writeD(Math.min(reward.getProgress(_player), _player.getLevel()));
+ packet.writeD(reward.getParams().getInt("level", -1) == -1 ? (status == 1 ? 0 : reward.getProgress(_player)) : _player.getLevel());
packet.writeD(reward.getRequiredCompletions());
}
return true;