Daily Mission new handler additions and updates.

Contributed by CostyKiller.
This commit is contained in:
MobiusDevelopment
2022-11-06 23:29:45 +00:00
parent 4d6f30dc23
commit 9cfbb26557
88 changed files with 6584 additions and 2350 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -20,17 +20,27 @@ import java.util.logging.Logger;
import org.l2jmobius.gameserver.handler.DailyMissionHandler;
import handlers.dailymissionhandlers.AuctionDailyMissionHandler;
import handlers.dailymissionhandlers.AugmentationDailyMissionHandler;
import handlers.dailymissionhandlers.BossDailyMissionHandler;
import handlers.dailymissionhandlers.CeremonyOfChaosDailyMissionHandler;
import handlers.dailymissionhandlers.CombinationDailyMissionHandler;
import handlers.dailymissionhandlers.CompoundDailyMissionHandler;
import handlers.dailymissionhandlers.EnchantDailyMissionHandler;
import handlers.dailymissionhandlers.EnsoulDailyMissionHandler;
import handlers.dailymissionhandlers.ExaltedDailyMissionHandler;
import handlers.dailymissionhandlers.FishingDailyMissionHandler;
import handlers.dailymissionhandlers.JoinClanDailyMissionHandler;
import handlers.dailymissionhandlers.LevelDailyMissionHandler;
import handlers.dailymissionhandlers.LoginMonthDailyMissionHandler;
import handlers.dailymissionhandlers.LoginWeekendDailyMissionHandler;
import handlers.dailymissionhandlers.MentorDailyMissionHandler;
import handlers.dailymissionhandlers.MonsterDailyMissionHandler;
import handlers.dailymissionhandlers.NoblesseDailyMissionHandler;
import handlers.dailymissionhandlers.OlympiadDailyMissionHandler;
import handlers.dailymissionhandlers.QuestDailyMissionHandler;
import handlers.dailymissionhandlers.SiegeDailyMissionHandler;
import handlers.dailymissionhandlers.UseItemDailyMissionHandler;
/**
* @author UnAfraid
@@ -41,17 +51,27 @@ public class DailyMissionMasterHandler
public static void main(String[] args)
{
DailyMissionHandler.getInstance().registerHandler("level", LevelDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("loginweekend", LoginWeekendDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("loginmonth", LoginMonthDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("quest", QuestDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("olympiad", OlympiadDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("siege", SiegeDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("ceremonyofchaos", CeremonyOfChaosDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("auction", AuctionDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("augment", AugmentationDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("boss", BossDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("monster", MonsterDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("ceremonyofchaos", CeremonyOfChaosDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("combine", CombinationDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("compound", CompoundDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("enchant", EnchantDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("ensoul", EnsoulDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("exalted", ExaltedDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("fishing", FishingDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("joinclan", JoinClanDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("level", LevelDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("loginmonth", LoginMonthDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("loginweekend", LoginWeekendDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("mentor", MentorDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("monster", MonsterDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("noblesse", NoblesseDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("olympiad", OlympiadDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("quest", QuestDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("siege", SiegeDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("useitem", UseItemDailyMissionHandler::new);
LOGGER.info(DailyMissionMasterHandler.class.getSimpleName() + ": Loaded " + DailyMissionHandler.getInstance().size() + " handlers.");
}
}

View File

@@ -0,0 +1,93 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package handlers.dailymissionhandlers;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAuctionWin;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class AuctionDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
public AuctionDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_amount = holder.getRequiredCompletions();
}
@Override
public void init()
{
Containers.Players().addListener(new ConsumerEventListener(this, EventType.ON_PLAYER_AUCTION_WIN, (OnPlayerAuctionWin event) -> onPlayerAuctionWin(event), this));
}
@Override
public boolean isAvailable(Player 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 onPlayerAuctionWin(OnPlayerAuctionWin event)
{
final Player player = event.getPlayer();
// Check if any condition needed here
processPlayerProgress(player);
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
}

View File

@@ -0,0 +1,133 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package handlers.dailymissionhandlers;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAugment;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class AugmentationDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _missionId;
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
private final Set<Integer> _mineralIds = new HashSet<>();
public AugmentationDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_missionId = holder.getId();
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
final String mineralIds = holder.getParams().getString("mineralIds", "");
if (!mineralIds.isEmpty())
{
for (String s : mineralIds.split(","))
{
final int id = Integer.parseInt(s);
if (!_mineralIds.contains(id))
{
_mineralIds.add(id);
}
}
}
}
@Override
public void init()
{
Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_AUGMENT, (OnPlayerAugment event) -> onPlayerAugment(event), this));
}
@Override
public boolean isAvailable(Player 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 onPlayerAugment(OnPlayerAugment event)
{
final Player player = event.getPlayer();
if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
{
return;
}
// Only missions with specific augment stones
if ((_missionId == 3055) || (_missionId == 3056) || (_missionId == 3057))
{
for (int mineralId : _mineralIds)
{
// Check if used item has been augmented with specified stones
if (player.getInventory().getItemByItemId(event.getItem().getId()).isAugmented() && (event.getItem().getAugmentation().getMineralId() == mineralId))
{
processPlayerProgress(player);
}
}
}
else if (_mineralIds.isEmpty())
{
processPlayerProgress(player);
}
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
}

View File

@@ -32,17 +32,19 @@ import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
public class CeremonyOfChaosDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
private final int _requiredMissionCompleteId;
public CeremonyOfChaosDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_requiredMissionCompleteId = holder.getRequiredMissionCompleteId();
_amount = holder.getRequiredCompletions();
}
@Override
public void init()
{
Containers.Global().addListener(new ConsumerEventListener(this, EventType.ON_CEREMONY_OF_CHAOS_MATCH_RESULT, (OnCeremonyOfChaosMatchResult event) -> onCeremonyOfChaosMatchResult(event), this));
Containers.Players().addListener(new ConsumerEventListener(this, EventType.ON_CEREMONY_OF_CHAOS_MATCH_RESULT, (OnCeremonyOfChaosMatchResult event) -> onCeremonyOfChaosMatchResult(event), this));
}
@Override
@@ -75,15 +77,34 @@ public class CeremonyOfChaosDailyMissionHandler extends AbstractDailyMissionHand
{
event.getMembers().forEach(member ->
{
final DailyMissionPlayerEntry entry = getPlayerEntry(member.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
if (((_requiredMissionCompleteId != 0) && checkRequiredMission(member)) || (_requiredMissionCompleteId == 0))
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
processPlayerProgress(member);
}
});
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
private boolean checkRequiredMission(Player player)
{
final int missionId = getPlayerEntry(player.getObjectId(), false).getRewardId();
final int missionStatus = getStatus(player);
if ((missionId != 0) && (_requiredMissionCompleteId != 0) && (missionId == _requiredMissionCompleteId) && (missionStatus == DailyMissionStatus.COMPLETED.getClientId()))
{
return true;
}
return false;
}
}

View File

@@ -0,0 +1,152 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package handlers.dailymissionhandlers;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCombination;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class CombinationDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _requiredMissionCompleteId;
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
private final Set<Integer> _itemIds = new HashSet<>();
private final int _itemId;
public CombinationDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_requiredMissionCompleteId = holder.getRequiredMissionCompleteId();
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
_itemId = holder.getParams().getInt("itemId", 0);
final String itemIds = holder.getParams().getString("itemIds", "");
if (!itemIds.isEmpty())
{
for (String s : itemIds.split(","))
{
final int id = Integer.parseInt(s);
if (!_itemIds.contains(id))
{
_itemIds.add(id);
}
}
}
else if (_itemId != 0)
{
_itemIds.add(holder.getParams().getInt("itemId"));
}
}
@Override
public void init()
{
Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_ITEM_COMBINATION, (OnItemCombination event) -> onItemCombination(event), this));
}
@Override
public boolean isAvailable(Player 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 onItemCombination(OnItemCombination event)
{
final Player player = event.getPlayer();
if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
{
return;
}
if (((_requiredMissionCompleteId != 0) && checkRequiredMission(player)) || (_requiredMissionCompleteId == 0))
{
if (!_itemIds.isEmpty())
{
for (int item : _itemIds)
{
// Check if used item has been obtained from item combination or alchemy
if (event.getItem().getId() == item)
{
processPlayerProgress(player);
}
}
}
else
{
processPlayerProgress(player);
}
}
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
private boolean checkRequiredMission(Player player)
{
final int missionId = getPlayerEntry(player.getObjectId(), false).getRewardId();
final int missionStatus = getStatus(player);
if ((missionId != 0) && (_requiredMissionCompleteId != 0) && (missionId == _requiredMissionCompleteId) && (missionStatus == DailyMissionStatus.COMPLETED.getClientId()))
{
return true;
}
return false;
}
}

View File

@@ -0,0 +1,152 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package handlers.dailymissionhandlers;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCompound;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class CompoundDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _requiredMissionCompleteId;
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
private final Set<Integer> _itemIds = new HashSet<>();
private final int _itemId;
public CompoundDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_requiredMissionCompleteId = holder.getRequiredMissionCompleteId();
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
_itemId = holder.getParams().getInt("itemId", 0);
final String itemIds = holder.getParams().getString("itemIds", "");
if (!itemIds.isEmpty())
{
for (String s : itemIds.split(","))
{
final int id = Integer.parseInt(s);
if (!_itemIds.contains(id))
{
_itemIds.add(id);
}
}
}
else if (_itemId != 0)
{
_itemIds.add(holder.getParams().getInt("itemId"));
}
}
@Override
public void init()
{
Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_ITEM_COMPOUND, (OnItemCompound event) -> onItemCompound(event), this));
}
@Override
public boolean isAvailable(Player 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 onItemCompound(OnItemCompound event)
{
final Player player = event.getPlayer();
if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
{
return;
}
if (((_requiredMissionCompleteId != 0) && checkRequiredMission(player)) || (_requiredMissionCompleteId == 0))
{
if (!_itemIds.isEmpty())
{
for (int item : _itemIds)
{
// Check if used item has been obtained from item combination or alchemy
if (event.getItem().getId() == item)
{
processPlayerProgress(player);
}
}
}
else
{
processPlayerProgress(player);
}
}
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
private boolean checkRequiredMission(Player player)
{
final int missionId = getPlayerEntry(player.getObjectId(), false).getRewardId();
final int missionStatus = getStatus(player);
if ((missionId != 0) && (_requiredMissionCompleteId != 0) && (missionId == _requiredMissionCompleteId) && (missionStatus == DailyMissionStatus.COMPLETED.getClientId()))
{
return true;
}
return false;
}
}

View File

@@ -0,0 +1,137 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package handlers.dailymissionhandlers;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemEnchantAdd;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class EnchantDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _requiredMissionCompleteId;
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
private final int _targetValue;
private final Set<Integer> _itemIds = new HashSet<>();
public EnchantDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_requiredMissionCompleteId = holder.getRequiredMissionCompleteId();
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
_targetValue = holder.getParams().getInt("targetValue", 0);
final String itemIds = holder.getParams().getString("itemIds", "");
if (!itemIds.isEmpty())
{
for (String s : itemIds.split(","))
{
final int id = Integer.parseInt(s);
if (!_itemIds.contains(id))
{
_itemIds.add(id);
}
}
}
}
@Override
public void init()
{
Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_ITEM_ENCHANT_ADD, (OnItemEnchantAdd event) -> onItemEnchantAdd(event), this));
}
@Override
public boolean isAvailable(Player 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 onItemEnchantAdd(OnItemEnchantAdd event)
{
final Player player = event.getPlayer();
if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
{
return;
}
if (((_requiredMissionCompleteId != 0) && checkRequiredMission(player)) || (_requiredMissionCompleteId == 0))
{
if (_itemIds.contains(event.getItem().getId()) && (player.getInventory().getItemByObjectId(event.getItem().getObjectId()).getEnchantLevel() >= _targetValue))
{
processPlayerProgress(player);
}
}
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
private boolean checkRequiredMission(Player player)
{
final int missionId = getPlayerEntry(player.getObjectId(), false).getRewardId();
final int missionStatus = getStatus(player);
if ((missionId != 0) && (_requiredMissionCompleteId != 0) && (missionId == _requiredMissionCompleteId) && (missionStatus == DailyMissionStatus.COMPLETED.getClientId()))
{
return true;
}
return false;
}
}

View File

@@ -0,0 +1,119 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package handlers.dailymissionhandlers;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemSoulCrystalAdd;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class EnsoulDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
private final Set<Integer> _crystalIds = new HashSet<>();
public EnsoulDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
final String crystalIds = holder.getParams().getString("crystalIds", "");
if (!crystalIds.isEmpty())
{
for (String s : crystalIds.split(","))
{
final int id = Integer.parseInt(s);
if (!_crystalIds.contains(id))
{
_crystalIds.add(id);
}
}
}
}
@Override
public void init()
{
Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_ITEM_SOUL_CRYSTAL_ADD, (OnItemSoulCrystalAdd event) -> onItemSoulCrystalAdd(event), this));
}
@Override
public boolean isAvailable(Player 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 onItemSoulCrystalAdd(OnItemSoulCrystalAdd event)
{
final Player player = event.getPlayer();
if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
{
return;
}
if (_crystalIds.contains(event.getEnsoulStone().getId()))
{
processPlayerProgress(player);
}
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
}

View File

@@ -0,0 +1,107 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package handlers.dailymissionhandlers;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerBecomeExalted;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class ExaltedDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
public ExaltedDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
}
@Override
public void init()
{
Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_BECOME_EXALTED, (OnPlayerBecomeExalted event) -> onPlayerBecomeExalted(event), this));
}
@Override
public boolean isAvailable(Player 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 onPlayerBecomeExalted(OnPlayerBecomeExalted event)
{
final Player player = event.getPlayer();
if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
{
return;
}
// Check if player is belonging to a clan and is exalted
if ((player.getClan() != null) && (player.getNobleLevel() > 0))
{
if (player.getNobleLevel() == 2)
{
processPlayerProgress(player);
}
}
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
}

View File

@@ -47,7 +47,7 @@ public class FishingDailyMissionHandler extends AbstractDailyMissionHandler
@Override
public void init()
{
Containers.Players().addListener(new ConsumerEventListener(this, EventType.ON_PLAYER_FISHING, (OnPlayerFishing event) -> onPlayerFishing(event), this));
Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_FISHING, (OnPlayerFishing event) -> onPlayerFishing(event), this));
}
@Override

View File

@@ -0,0 +1,107 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package handlers.dailymissionhandlers;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.instancemanager.MentorManager;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.Mentee;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMenteeTrainingComplete;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class MentorDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
public MentorDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
}
@Override
public void init()
{
Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_MENTEE_TRAINING_COMPLETE, (OnPlayerMenteeTrainingComplete event) -> onPlayerMenteeTrainingComplete(event), this));
}
@Override
public boolean isAvailable(Player 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 onPlayerMenteeTrainingComplete(OnPlayerMenteeTrainingComplete event)
{
final Player player = event.getMentor();
final Mentee mentor = MentorManager.getInstance().getMentor(event.getMentee().getObjectId());
if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
{
return;
}
// TODO: Check mentor for mentee training complete
if (player == mentor.getPlayer())
{
processPlayerProgress(player);
}
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
}

View File

@@ -16,6 +16,9 @@
*/
package handlers.dailymissionhandlers;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -39,14 +42,18 @@ import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
*/
public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _requiredMissionCompleteId;
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
private final Set<Integer> _ids = new HashSet<>();
private final String _startHour;
private final String _endHour;
public MonsterDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_requiredMissionCompleteId = holder.getRequiredMissionCompleteId();
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
@@ -62,6 +69,8 @@ public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
}
}
}
_startHour = holder.getParams().getString("startHour", "");
_endHour = holder.getParams().getString("endHour", "");
}
@Override
@@ -110,24 +119,29 @@ public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
{
return;
}
final Party party = player.getParty();
if (party != null)
if (((_requiredMissionCompleteId != 0) && checkRequiredMission(player)) || (_requiredMissionCompleteId == 0))
{
final CommandChannel channel = party.getCommandChannel();
final List<Player> members = channel != null ? channel.getMembers() : party.getMembers();
for (Player member : members)
if (checkTimeInterval() || ((_startHour == "") && (_endHour == "")))
{
if ((member.getLevel() >= (monsterLevel - 5)) && (member.calculateDistance3D(monster) <= Config.ALT_PARTY_RANGE))
final Party party = player.getParty();
if (party != null)
{
processPlayerProgress(member);
final CommandChannel channel = party.getCommandChannel();
final List<Player> members = channel != null ? channel.getMembers() : party.getMembers();
for (Player member : members)
{
if ((member.getLevel() >= (monsterLevel - 5)) && (member.calculateDistance3D(monster) <= Config.ALT_PARTY_RANGE))
{
processPlayerProgress(member);
}
}
}
else
{
processPlayerProgress(player);
}
}
}
else
{
processPlayerProgress(player);
}
}
private void processPlayerProgress(Player player)
@@ -142,4 +156,39 @@ public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
storePlayerEntry(entry);
}
}
private boolean checkTimeInterval()
{
if ((_startHour != "") && (_endHour != ""))
{
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
dateFormat.format(date);
try
{
// Check param hours
if (dateFormat.parse(dateFormat.format(date)).after(dateFormat.parse(_startHour)) && dateFormat.parse(dateFormat.format(date)).before(dateFormat.parse(_endHour)))
{
return true;
}
}
catch (ParseException e)
{
e.printStackTrace();
}
}
return false;
}
private boolean checkRequiredMission(Player player)
{
final int missionId = getPlayerEntry(player.getObjectId(), false).getRewardId();
final int missionStatus = getStatus(player);
if ((missionId != 0) && (_requiredMissionCompleteId != 0) && (missionId == _requiredMissionCompleteId) && (missionStatus == DailyMissionStatus.COMPLETED.getClientId()))
{
return true;
}
return false;
}
}

View File

@@ -0,0 +1,107 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package handlers.dailymissionhandlers;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerBecomeNoblesse;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class NoblesseDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
public NoblesseDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
}
@Override
public void init()
{
Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_BECOME_NOBLESSE, (OnPlayerBecomeNoblesse event) -> onPlayerBecomeNoblesse(event), this));
}
@Override
public boolean isAvailable(Player 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 onPlayerBecomeNoblesse(OnPlayerBecomeNoblesse event)
{
final Player player = event.getPlayer();
if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
{
return;
}
// Check if player is belonging to a clan and is noble
if ((player.getClan() != null) && (player.getNobleLevel() > 0))
{
if (player.getNobleLevel() == 1)
{
processPlayerProgress(player);
}
}
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
}

View File

@@ -33,10 +33,12 @@ public class OlympiadDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
private final boolean _winOnly;
private final int _requiredMissionCompleteId;
public OlympiadDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_requiredMissionCompleteId = holder.getRequiredMissionCompleteId();
_amount = holder.getRequiredCompletions();
_winOnly = holder.getParams().getBoolean("winOnly", false);
}
@@ -78,27 +80,44 @@ public class OlympiadDailyMissionHandler extends AbstractDailyMissionHandler
if (event.getWinner() != null)
{
final DailyMissionPlayerEntry winnerEntry = getPlayerEntry(event.getWinner().getObjectId(), true);
if (winnerEntry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
if (((_requiredMissionCompleteId != 0) && checkRequiredMission(event.getWinner().getPlayer())) || (_requiredMissionCompleteId == 0))
{
if (winnerEntry.increaseProgress() >= _amount)
if (winnerEntry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
winnerEntry.setStatus(DailyMissionStatus.AVAILABLE);
if (winnerEntry.increaseProgress() >= _amount)
{
winnerEntry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(winnerEntry);
}
storePlayerEntry(winnerEntry);
}
}
if (!_winOnly && (event.getLoser() != null))
{
final DailyMissionPlayerEntry loseEntry = getPlayerEntry(event.getLoser().getObjectId(), true);
if (loseEntry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
if (((_requiredMissionCompleteId != 0) && checkRequiredMission(event.getLoser().getPlayer())) || (_requiredMissionCompleteId == 0))
{
if (loseEntry.increaseProgress() >= _amount)
if (loseEntry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
loseEntry.setStatus(DailyMissionStatus.AVAILABLE);
if (loseEntry.increaseProgress() >= _amount)
{
loseEntry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(loseEntry);
}
storePlayerEntry(loseEntry);
}
}
}
private boolean checkRequiredMission(Player player)
{
final int missionId = getPlayerEntry(player.getObjectId(), false).getRewardId();
final int missionStatus = getStatus(player);
if ((missionId != 0) && (_requiredMissionCompleteId != 0) && (missionId == _requiredMissionCompleteId) && (missionStatus == DailyMissionStatus.COMPLETED.getClientId()))
{
return true;
}
return false;
}
}

View File

@@ -17,7 +17,6 @@
package handlers.dailymissionhandlers;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.enums.QuestType;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
@@ -33,11 +32,13 @@ import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
public class QuestDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
private final int _questId;
public QuestDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_amount = holder.getRequiredCompletions();
_questId = holder.getParams().getInt("questId", 0);
}
@Override
@@ -75,17 +76,23 @@ public class QuestDailyMissionHandler extends AbstractDailyMissionHandler
private void onQuestComplete(OnPlayerQuestComplete event)
{
final Player player = event.getPlayer();
if (event.getQuestType() == QuestType.DAILY)
// Check if player has active quest the quest id specified
if ((_questId == event.getQuestId()) && player.getQuestState(event.getQuestName()).isCompleted())
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
processPlayerProgress(player);
}
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
}

View File

@@ -0,0 +1,122 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package handlers.dailymissionhandlers;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemUse;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class UseItemDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
private final Set<Integer> _itemIds = new HashSet<>();
public UseItemDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
final String itemIds = holder.getParams().getString("itemIds", "");
if (!itemIds.isEmpty())
{
for (String s : itemIds.split(","))
{
final int id = Integer.parseInt(s);
if (!_itemIds.contains(id))
{
_itemIds.add(id);
}
}
}
}
@Override
public void init()
{
Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_ITEM_USE, (OnItemUse event) -> onItemUse(event), this));
}
@Override
public boolean isAvailable(Player 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 onItemUse(OnItemUse event)
{
final Player player = event.getPlayer();
if (_minLevel > 0)
{
if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel) || _itemIds.isEmpty())
{
return;
}
if (_itemIds.contains(event.getItem().getId()))
{
processPlayerProgress(player);
}
}
}
private void processPlayerProgress(Player player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
{
if (entry.increaseProgress() >= _amount)
{
entry.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(entry);
}
}
}

View File

@@ -36,6 +36,7 @@
<xs:attribute type="xs:short" name="id" />
<xs:attribute type="xs:short" name="reward_id" />
<xs:attribute type="xs:string" name="name" />
<xs:attribute type="xs:int" name="requiredMissionCompleteId" />
<xs:attribute type="xs:int" name="requiredCompletion" />
<xs:attribute type="xs:boolean" name="dailyReset" />
<xs:attribute type="xs:boolean" name="isOneTime" />

View File

@@ -2086,6 +2086,7 @@
</xs:complexType>
</xs:element>
<xs:element name="damageModifier" type="xs:decimal" />
<xs:element name="abnormalPower" type="xs:unsignedShort" />
<xs:element name="animationSpeed" type="xs:unsignedShort" />
<xs:element name="pAtkMod">
<xs:complexType mixed="true">
@@ -2094,7 +2095,9 @@
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="level" type="xs:unsignedByte" use="required" />
<xs:attribute name="level" type="xs:unsignedByte" use="optional" />
<xs:attribute name="fromLevel" type="xs:unsignedByte" use="optional" />
<xs:attribute name="toLevel" type="xs:unsignedByte" use="optional" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
@@ -2842,6 +2845,8 @@
</xs:complexType>
</xs:element>
<xs:element name="slot" type="xs:string" />
<xs:element name="rate" type="xs:unsignedByte" />
<xs:element name="dispel" type="xs:string" />
<xs:element name="attribute" type="xs:string" />
<xs:element name="mode" type="xs:string" />
<xs:element name="model" type="xs:string" />