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;