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" />

View File

@ -36,6 +36,7 @@ public class DailyMissionDataHolder
private final int _id;
private final List<ItemHolder> _rewardsItems;
private final List<ClassId> _classRestriction;
private final int _requiredMissionCompleteId;
private final int _requiredCompletions;
private final StatSet _params;
private final boolean _dailyReset;
@ -50,6 +51,7 @@ public class DailyMissionDataHolder
{
final Function<DailyMissionDataHolder, AbstractDailyMissionHandler> handler = DailyMissionHandler.getInstance().getHandler(set.getString("handler"));
_id = set.getInt("id");
_requiredMissionCompleteId = set.getInt("requiredMissionCompleteId", 0);
_requiredCompletions = set.getInt("requiredCompletion", 0);
_rewardsItems = set.getList("items", ItemHolder.class);
_classRestriction = set.getList("classRestriction", ClassId.class);
@ -78,6 +80,11 @@ public class DailyMissionDataHolder
return _rewardsItems;
}
public int getRequiredMissionCompleteId()
{
return _requiredMissionCompleteId;
}
public int getRequiredCompletions()
{
return _requiredCompletions;

View File

@ -59,7 +59,10 @@ import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcTeleportRequest;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAbilityPointsChanged;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAuctionWin;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAugment;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerBecomeExalted;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerBecomeNoblesse;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerBypass;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerCallToChangeClass;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerChangeToAwakenedClass;
@ -94,6 +97,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMentee
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMenteeLeft;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMenteeRemove;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMenteeStatus;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMenteeTrainingComplete;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMentorStatus;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerPKChanged;
@ -124,6 +128,8 @@ import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceLeave;
import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceStatusChange;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemAttributeAdd;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemBypassEvent;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCombination;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCompound;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemEnchantAdd;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemSoulCrystalAdd;
@ -189,6 +195,8 @@ public enum EventType
ON_ITEM_ATTRIBUTE_ADD(OnItemAttributeAdd.class, void.class),
ON_ITEM_SOUL_CRYSTAL_ADD(OnItemSoulCrystalAdd.class, void.class),
ON_ITEM_ENCHANT_ADD(OnItemEnchantAdd.class, void.class),
ON_ITEM_COMBINATION(OnItemCombination.class, void.class),
ON_ITEM_COMPOUND(OnItemCompound.class, void.class),
// NPC events
ON_NPC_CAN_BE_SEEN(OnNpcCanBeSeen.class, void.class, TerminateReturn.class),
@ -219,9 +227,12 @@ public enum EventType
ON_PLAYABLE_EXP_CHANGED(OnPlayableExpChanged.class, void.class, TerminateReturn.class),
// Player events
ON_PLAYER_AUCTION_WIN(OnPlayerAuctionWin.class, void.class),
ON_PLAYER_AUGMENT(OnPlayerAugment.class, void.class),
ON_PLAYER_BYPASS(OnPlayerBypass.class, void.class, TerminateReturn.class),
ON_PLAYER_CALL_TO_CHANGE_CLASS(OnPlayerCallToChangeClass.class, void.class),
ON_PLAYER_BECOME_NOBLESSE(OnPlayerBecomeNoblesse.class, void.class),
ON_PLAYER_BECOME_EXALTED(OnPlayerBecomeExalted.class, void.class),
ON_PLAYER_CHAT(OnPlayerChat.class, void.class, ChatFilterReturn.class),
ON_PLAYER_ABILITY_POINTS_CHANGED(OnPlayerAbilityPointsChanged.class, void.class),
// Clan events
@ -256,6 +267,7 @@ public enum EventType
ON_PLAYER_MENTEE_LEFT(OnPlayerMenteeLeft.class, void.class),
ON_PLAYER_MENTEE_REMOVE(OnPlayerMenteeRemove.class, void.class),
ON_PLAYER_MENTEE_STATUS(OnPlayerMenteeStatus.class, void.class),
ON_PLAYER_MENTEE_TRAINING_COMPLETE(OnPlayerMenteeTrainingComplete.class, void.class),
ON_PLAYER_MENTOR_STATUS(OnPlayerMentorStatus.class, void.class),
// Other player events
ON_PLAYER_REPUTATION_CHANGED(OnPlayerReputationChanged.class, void.class),

View File

@ -0,0 +1,53 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.instance.Item;
/**
* @author CostyKiller
*/
public class OnPlayerAuctionWin implements IBaseEvent
{
private final Player _player;
private final Item _item;
public OnPlayerAuctionWin(Player player, Item item)
{
_player = player;
_item = item;
}
public Player getPlayer()
{
return _player;
}
public Item getItem()
{
return _item;
}
@Override
public EventType getType()
{
return EventType.ON_PLAYER_AUCTION_WIN;
}
}

View File

@ -0,0 +1,45 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
/**
* @author CostyKiller
*/
public class OnPlayerBecomeExalted implements IBaseEvent
{
private final Player _player;
public OnPlayerBecomeExalted(Player player)
{
_player = player;
}
public Player getPlayer()
{
return _player;
}
@Override
public EventType getType()
{
return EventType.ON_PLAYER_BECOME_EXALTED;
}
}

View File

@ -0,0 +1,45 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
/**
* @author CostyKiller
*/
public class OnPlayerBecomeNoblesse implements IBaseEvent
{
private final Player _player;
public OnPlayerBecomeNoblesse(Player player)
{
_player = player;
}
public Player getPlayer()
{
return _player;
}
@Override
public EventType getType()
{
return EventType.ON_PLAYER_BECOME_NOBLESSE;
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
/**
* @author CostyKiller
*/
public class OnPlayerMenteeTrainingComplete implements IBaseEvent
{
private final Player _mentor;
private final Player _mentee;
public OnPlayerMenteeTrainingComplete(Player mentor, Player mentee)
{
_mentor = mentor;
_mentee = mentee;
}
public Player getMentor()
{
return _mentor;
}
public Player getMentee()
{
return _mentee;
}
@Override
public EventType getType()
{
return EventType.ON_PLAYER_MENTEE_TRAINING_COMPLETE;
}
}

View File

@ -28,12 +28,14 @@ public class OnPlayerQuestComplete implements IBaseEvent
{
private final Player _player;
private final int _questId;
private final String _questName;
private final QuestType _questType;
public OnPlayerQuestComplete(Player player, int questId, QuestType questType)
public OnPlayerQuestComplete(Player player, int questId, String questName, QuestType questType)
{
_player = player;
_questId = questId;
_questName = questName;
_questType = questType;
}
@ -47,6 +49,11 @@ public class OnPlayerQuestComplete implements IBaseEvent
return _questId;
}
public String getQuestName()
{
return _questName;
}
public QuestType getQuestType()
{
return _questType;

View File

@ -0,0 +1,53 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.item;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.instance.Item;
/**
* @author CostyKiller
*/
public class OnItemCombination implements IBaseEvent
{
private final Player _player;
private final Item _item;
public OnItemCombination(Player player, Item item)
{
_player = player;
_item = item;
}
public Player getPlayer()
{
return _player;
}
public Item getItem()
{
return _item;
}
@Override
public EventType getType()
{
return EventType.ON_ITEM_COMBINATION;
}
}

View File

@ -0,0 +1,53 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.item;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.instance.Item;
/**
* @author CostyKiller
*/
public class OnItemCompound implements IBaseEvent
{
private final Player _player;
private final Item _item;
public OnItemCompound(Player player, Item item)
{
_player = player;
_item = item;
}
public Player getPlayer()
{
return _player;
}
public Item getItem()
{
return _item;
}
@Override
public EventType getType()
{
return EventType.ON_ITEM_COMPOUND;
}
}

View File

@ -17,6 +17,7 @@
package org.l2jmobius.gameserver.model.events.impl.item;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.ensoul.EnsoulStone;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.instance.Item;
@ -28,11 +29,13 @@ public class OnItemSoulCrystalAdd implements IBaseEvent
{
private final Player _player;
private final Item _item;
private final EnsoulStone _stone;
public OnItemSoulCrystalAdd(Player player, Item item)
public OnItemSoulCrystalAdd(Player player, Item item, EnsoulStone stone)
{
_player = player;
_item = item;
_stone = stone;
}
public Player getPlayer()
@ -45,6 +48,11 @@ public class OnItemSoulCrystalAdd implements IBaseEvent
return _item;
}
public EnsoulStone getEnsoulStone()
{
return _stone;
}
@Override
public EventType getType()
{

View File

@ -71,7 +71,6 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemPi
import org.l2jmobius.gameserver.model.events.impl.item.OnItemAttributeAdd;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemBypassEvent;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemEnchantAdd;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemSoulCrystalAdd;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemTalk;
import org.l2jmobius.gameserver.model.holders.AgathionSkillHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -2250,12 +2249,6 @@ public class Item extends WorldObject
{
updateSpecialAbilities();
}
// Notify to Scripts
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_SOUL_CRYSTAL_ADD))
{
EventDispatcher.getInstance().notifyEventAsync(new OnItemSoulCrystalAdd(getActingPlayer(), this));
}
}
public void removeSpecialAbility(int position, int type)

View File

@ -729,7 +729,7 @@ public class QuestState
// Notify to scripts
if (EventDispatcher.getInstance().hasListener(EventType.ON_PLAYER_QUEST_COMPLETE, _player))
{
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerQuestComplete(_player, getQuest().getId(), type), _player);
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerQuestComplete(_player, getQuest().getId(), getQuestName(), type), _player);
}
}
@ -819,7 +819,7 @@ public class QuestState
// Notify to scripts
if (EventDispatcher.getInstance().hasListener(EventType.ON_PLAYER_QUEST_COMPLETE, _player))
{
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerQuestComplete(_player, getQuest().getId(), repeatable ? QuestType.REPEATABLE : QuestType.ONE_TIME), _player);
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerQuestComplete(_player, getQuest().getId(), getQuestName(), repeatable ? QuestType.REPEATABLE : QuestType.ONE_TIME), _player);
}
}

View File

@ -25,6 +25,9 @@ import org.l2jmobius.gameserver.data.xml.ItemCrystallizationData;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCombination;
import org.l2jmobius.gameserver.model.holders.ItemChanceHolder;
import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.item.type.CrystalType;
@ -249,7 +252,11 @@ public class RequestCrystallizeItem implements ClientPacket
sm = new SystemMessage(SystemMessageId.S1_HAS_BEEN_CRYSTALLIZED);
sm.addItemName(removedItem);
player.sendPacket(sm);
// Notify to scripts.
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_COMBINATION))
{
EventDispatcher.getInstance().notifyEventAsync(new OnItemCombination(player, removedItem));
}
player.broadcastUserInfo();
player.setInCrystallize(false);

View File

@ -24,6 +24,9 @@ import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.alchemy.AlchemyCraftData;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCombination;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.item.ItemTemplate;
import org.l2jmobius.gameserver.model.item.instance.Item;
@ -197,6 +200,16 @@ public class RequestAlchemyConversion implements ClientPacket
player.getInventory().addItem("Alchemy", data.getProductionFailure().getId(), data.getProductionFailure().getCount() * failureCount, player, null);
}
// Notify to scripts.
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_COMBINATION))
{
for (ItemHolder ingredient : data.getIngredients())
{
final Item item = player.getInventory().getItemByItemId(ingredient.getId());
EventDispatcher.getInstance().notifyEventAsync(new OnItemCombination(player, item));
}
}
player.sendPacket(new ExAlchemyConversion(successCount, failureCount));
}
}

View File

@ -20,6 +20,9 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.request.CompoundRequest;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCompound;
import org.l2jmobius.gameserver.model.item.combination.CombinationItem;
import org.l2jmobius.gameserver.model.item.combination.CombinationItemReward;
import org.l2jmobius.gameserver.model.item.combination.CombinationItemType;
@ -118,6 +121,11 @@ public class RequestNewEnchantTry implements ClientPacket
{
player.sendPacket(new ExEnchantFail(itemOne.getId(), itemTwo.getId()));
}
// Notify to scripts.
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_COMPOUND))
{
EventDispatcher.getInstance().notifyEventAsync(new OnItemCompound(player, success ? item : itemOne));
}
}
final InventoryUpdate iu = new InventoryUpdate();

View File

@ -22,6 +22,9 @@ import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.ensoul.EnsoulOption;
import org.l2jmobius.gameserver.model.ensoul.EnsoulStone;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemSoulCrystalAdd;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.AbnormalType;
@ -60,7 +63,6 @@ public class RequestItemEnsoul implements ClientPacket
_options[i] = new EnsoulItemOption(type, position, soulCrystalObjectId, soulCrystalOption);
}
}
return;
}
}
@ -217,6 +219,12 @@ public class RequestItemEnsoul implements ClientPacket
{
item.addSpecialAbility(option, position, stone.getSlotType(), true);
success = 1;
// Notify to Scripts
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_SOUL_CRYSTAL_ADD))
{
EventDispatcher.getInstance().notifyEventAsync(new OnItemSoulCrystalAdd(player, item, stone));
}
}
if (soulCrystal.isStackable() && (soulCrystal.getCount() > 0))

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>
@ -2843,6 +2846,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" />

View File

@ -36,6 +36,7 @@ public class DailyMissionDataHolder
private final int _id;
private final List<ItemHolder> _rewardsItems;
private final List<ClassId> _classRestriction;
private final int _requiredMissionCompleteId;
private final int _requiredCompletions;
private final StatSet _params;
private final boolean _dailyReset;
@ -50,6 +51,7 @@ public class DailyMissionDataHolder
{
final Function<DailyMissionDataHolder, AbstractDailyMissionHandler> handler = DailyMissionHandler.getInstance().getHandler(set.getString("handler"));
_id = set.getInt("id");
_requiredMissionCompleteId = set.getInt("requiredMissionCompleteId", 0);
_requiredCompletions = set.getInt("requiredCompletion", 0);
_rewardsItems = set.getList("items", ItemHolder.class);
_classRestriction = set.getList("classRestriction", ClassId.class);
@ -78,6 +80,11 @@ public class DailyMissionDataHolder
return _rewardsItems;
}
public int getRequiredMissionCompleteId()
{
return _requiredMissionCompleteId;
}
public int getRequiredCompletions()
{
return _requiredCompletions;

View File

@ -59,7 +59,10 @@ import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcTeleportRequest;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAbilityPointsChanged;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAuctionWin;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAugment;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerBecomeExalted;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerBecomeNoblesse;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerBypass;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerCallToChangeClass;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerChangeToAwakenedClass;
@ -94,6 +97,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMentee
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMenteeLeft;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMenteeRemove;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMenteeStatus;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMenteeTrainingComplete;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMentorStatus;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerPKChanged;
@ -124,6 +128,8 @@ import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceLeave;
import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceStatusChange;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemAttributeAdd;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemBypassEvent;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCombination;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCompound;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemEnchantAdd;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemSoulCrystalAdd;
@ -189,6 +195,8 @@ public enum EventType
ON_ITEM_ATTRIBUTE_ADD(OnItemAttributeAdd.class, void.class),
ON_ITEM_SOUL_CRYSTAL_ADD(OnItemSoulCrystalAdd.class, void.class),
ON_ITEM_ENCHANT_ADD(OnItemEnchantAdd.class, void.class),
ON_ITEM_COMBINATION(OnItemCombination.class, void.class),
ON_ITEM_COMPOUND(OnItemCompound.class, void.class),
// NPC events
ON_NPC_CAN_BE_SEEN(OnNpcCanBeSeen.class, void.class, TerminateReturn.class),
@ -219,9 +227,12 @@ public enum EventType
ON_PLAYABLE_EXP_CHANGED(OnPlayableExpChanged.class, void.class, TerminateReturn.class),
// Player events
ON_PLAYER_AUCTION_WIN(OnPlayerAuctionWin.class, void.class),
ON_PLAYER_AUGMENT(OnPlayerAugment.class, void.class),
ON_PLAYER_BYPASS(OnPlayerBypass.class, void.class, TerminateReturn.class),
ON_PLAYER_CALL_TO_CHANGE_CLASS(OnPlayerCallToChangeClass.class, void.class),
ON_PLAYER_BECOME_NOBLESSE(OnPlayerBecomeNoblesse.class, void.class),
ON_PLAYER_BECOME_EXALTED(OnPlayerBecomeExalted.class, void.class),
ON_PLAYER_CHAT(OnPlayerChat.class, void.class, ChatFilterReturn.class),
ON_PLAYER_ABILITY_POINTS_CHANGED(OnPlayerAbilityPointsChanged.class, void.class),
// Clan events
@ -256,6 +267,7 @@ public enum EventType
ON_PLAYER_MENTEE_LEFT(OnPlayerMenteeLeft.class, void.class),
ON_PLAYER_MENTEE_REMOVE(OnPlayerMenteeRemove.class, void.class),
ON_PLAYER_MENTEE_STATUS(OnPlayerMenteeStatus.class, void.class),
ON_PLAYER_MENTEE_TRAINING_COMPLETE(OnPlayerMenteeTrainingComplete.class, void.class),
ON_PLAYER_MENTOR_STATUS(OnPlayerMentorStatus.class, void.class),
// Other player events
ON_PLAYER_REPUTATION_CHANGED(OnPlayerReputationChanged.class, void.class),

View File

@ -0,0 +1,53 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.instance.Item;
/**
* @author CostyKiller
*/
public class OnPlayerAuctionWin implements IBaseEvent
{
private final Player _player;
private final Item _item;
public OnPlayerAuctionWin(Player player, Item item)
{
_player = player;
_item = item;
}
public Player getPlayer()
{
return _player;
}
public Item getItem()
{
return _item;
}
@Override
public EventType getType()
{
return EventType.ON_PLAYER_AUCTION_WIN;
}
}

View File

@ -0,0 +1,45 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
/**
* @author CostyKiller
*/
public class OnPlayerBecomeExalted implements IBaseEvent
{
private final Player _player;
public OnPlayerBecomeExalted(Player player)
{
_player = player;
}
public Player getPlayer()
{
return _player;
}
@Override
public EventType getType()
{
return EventType.ON_PLAYER_BECOME_EXALTED;
}
}

View File

@ -0,0 +1,45 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
/**
* @author CostyKiller
*/
public class OnPlayerBecomeNoblesse implements IBaseEvent
{
private final Player _player;
public OnPlayerBecomeNoblesse(Player player)
{
_player = player;
}
public Player getPlayer()
{
return _player;
}
@Override
public EventType getType()
{
return EventType.ON_PLAYER_BECOME_NOBLESSE;
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
/**
* @author CostyKiller
*/
public class OnPlayerMenteeTrainingComplete implements IBaseEvent
{
private final Player _mentor;
private final Player _mentee;
public OnPlayerMenteeTrainingComplete(Player mentor, Player mentee)
{
_mentor = mentor;
_mentee = mentee;
}
public Player getMentor()
{
return _mentor;
}
public Player getMentee()
{
return _mentee;
}
@Override
public EventType getType()
{
return EventType.ON_PLAYER_MENTEE_TRAINING_COMPLETE;
}
}

View File

@ -28,12 +28,14 @@ public class OnPlayerQuestComplete implements IBaseEvent
{
private final Player _player;
private final int _questId;
private final String _questName;
private final QuestType _questType;
public OnPlayerQuestComplete(Player player, int questId, QuestType questType)
public OnPlayerQuestComplete(Player player, int questId, String questName, QuestType questType)
{
_player = player;
_questId = questId;
_questName = questName;
_questType = questType;
}
@ -47,6 +49,11 @@ public class OnPlayerQuestComplete implements IBaseEvent
return _questId;
}
public String getQuestName()
{
return _questName;
}
public QuestType getQuestType()
{
return _questType;

View File

@ -0,0 +1,53 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.item;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.instance.Item;
/**
* @author CostyKiller
*/
public class OnItemCombination implements IBaseEvent
{
private final Player _player;
private final Item _item;
public OnItemCombination(Player player, Item item)
{
_player = player;
_item = item;
}
public Player getPlayer()
{
return _player;
}
public Item getItem()
{
return _item;
}
@Override
public EventType getType()
{
return EventType.ON_ITEM_COMBINATION;
}
}

View File

@ -0,0 +1,53 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.item;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.instance.Item;
/**
* @author CostyKiller
*/
public class OnItemCompound implements IBaseEvent
{
private final Player _player;
private final Item _item;
public OnItemCompound(Player player, Item item)
{
_player = player;
_item = item;
}
public Player getPlayer()
{
return _player;
}
public Item getItem()
{
return _item;
}
@Override
public EventType getType()
{
return EventType.ON_ITEM_COMPOUND;
}
}

View File

@ -17,6 +17,7 @@
package org.l2jmobius.gameserver.model.events.impl.item;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.ensoul.EnsoulStone;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.instance.Item;
@ -28,11 +29,13 @@ public class OnItemSoulCrystalAdd implements IBaseEvent
{
private final Player _player;
private final Item _item;
private final EnsoulStone _stone;
public OnItemSoulCrystalAdd(Player player, Item item)
public OnItemSoulCrystalAdd(Player player, Item item, EnsoulStone stone)
{
_player = player;
_item = item;
_stone = stone;
}
public Player getPlayer()
@ -45,6 +48,11 @@ public class OnItemSoulCrystalAdd implements IBaseEvent
return _item;
}
public EnsoulStone getEnsoulStone()
{
return _stone;
}
@Override
public EventType getType()
{

View File

@ -72,7 +72,6 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemPi
import org.l2jmobius.gameserver.model.events.impl.item.OnItemAttributeAdd;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemBypassEvent;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemEnchantAdd;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemSoulCrystalAdd;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemTalk;
import org.l2jmobius.gameserver.model.holders.AgathionSkillHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -2260,12 +2259,6 @@ public class Item extends WorldObject
{
updateSpecialAbilities();
}
// Notify to Scripts
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_SOUL_CRYSTAL_ADD))
{
EventDispatcher.getInstance().notifyEventAsync(new OnItemSoulCrystalAdd(getActingPlayer(), this));
}
}
public void removeSpecialAbility(int position, int type)

View File

@ -729,7 +729,7 @@ public class QuestState
// Notify to scripts
if (EventDispatcher.getInstance().hasListener(EventType.ON_PLAYER_QUEST_COMPLETE, _player))
{
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerQuestComplete(_player, getQuest().getId(), type), _player);
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerQuestComplete(_player, getQuest().getId(), getQuestName(), type), _player);
}
}
@ -819,7 +819,7 @@ public class QuestState
// Notify to scripts
if (EventDispatcher.getInstance().hasListener(EventType.ON_PLAYER_QUEST_COMPLETE, _player))
{
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerQuestComplete(_player, getQuest().getId(), repeatable ? QuestType.REPEATABLE : QuestType.ONE_TIME), _player);
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerQuestComplete(_player, getQuest().getId(), getQuestName(), repeatable ? QuestType.REPEATABLE : QuestType.ONE_TIME), _player);
}
}

View File

@ -25,6 +25,9 @@ import org.l2jmobius.gameserver.data.xml.ItemCrystallizationData;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCombination;
import org.l2jmobius.gameserver.model.holders.ItemChanceHolder;
import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.item.type.CrystalType;
@ -249,7 +252,11 @@ public class RequestCrystallizeItem implements ClientPacket
sm = new SystemMessage(SystemMessageId.S1_HAS_BEEN_CRYSTALLIZED);
sm.addItemName(removedItem);
player.sendPacket(sm);
// Notify to scripts.
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_COMBINATION))
{
EventDispatcher.getInstance().notifyEventAsync(new OnItemCombination(player, removedItem));
}
player.broadcastUserInfo();
player.setInCrystallize(false);

View File

@ -24,6 +24,9 @@ import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.alchemy.AlchemyCraftData;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCombination;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.item.ItemTemplate;
import org.l2jmobius.gameserver.model.item.instance.Item;
@ -197,6 +200,16 @@ public class RequestAlchemyConversion implements ClientPacket
player.getInventory().addItem("Alchemy", data.getProductionFailure().getId(), data.getProductionFailure().getCount() * failureCount, player, null);
}
// Notify to scripts.
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_COMBINATION))
{
for (ItemHolder ingredient : data.getIngredients())
{
final Item item = player.getInventory().getItemByItemId(ingredient.getId());
EventDispatcher.getInstance().notifyEventAsync(new OnItemCombination(player, item));
}
}
player.sendPacket(new ExAlchemyConversion(successCount, failureCount));
}
}

View File

@ -20,6 +20,9 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.CombinationItemsData;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.request.CompoundRequest;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCompound;
import org.l2jmobius.gameserver.model.item.combination.CombinationItem;
import org.l2jmobius.gameserver.model.item.combination.CombinationItemReward;
import org.l2jmobius.gameserver.model.item.combination.CombinationItemType;
@ -118,6 +121,11 @@ public class RequestNewEnchantTry implements ClientPacket
{
player.sendPacket(new ExEnchantFail(itemOne.getId(), itemTwo.getId()));
}
// Notify to scripts.
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_COMPOUND))
{
EventDispatcher.getInstance().notifyEventAsync(new OnItemCompound(player, success ? item : itemOne));
}
}
final InventoryUpdate iu = new InventoryUpdate();

View File

@ -22,6 +22,9 @@ import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.ensoul.EnsoulOption;
import org.l2jmobius.gameserver.model.ensoul.EnsoulStone;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemSoulCrystalAdd;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.skill.AbnormalType;
@ -60,7 +63,6 @@ public class RequestItemEnsoul implements ClientPacket
_options[i] = new EnsoulItemOption(type, position, soulCrystalObjectId, soulCrystalOption);
}
}
return;
}
}
@ -217,6 +219,12 @@ public class RequestItemEnsoul implements ClientPacket
{
item.addSpecialAbility(option, position, stone.getSlotType(), true);
success = 1;
// Notify to Scripts
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_SOUL_CRYSTAL_ADD))
{
EventDispatcher.getInstance().notifyEventAsync(new OnItemSoulCrystalAdd(player, item, stone));
}
}
if (soulCrystal.isStackable() && (soulCrystal.getCount() > 0))

View File

@ -1,8 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/DailyMission.xsd">
<!-- Daily Repeatable Missions -->
<reward id="2001" reward_id="2001" name="Daily Hunting I (Lv. 21-40)" requiredCompletion="30" isOneTime="false">
<!-- Daily mission. A reward is given for killing any 30 monsters. Monsters whose level is lower than the character's for more than 10 levels do not count. -->
<handler name="monster">
@ -380,9 +377,6 @@
<item id="97145" count="30" /> <!-- Ancient Adena -->
</items>
</reward>
<!-- One Time Missions -->
<reward id="1141" reward_id="827" name="Adventurer's Journey I (Lv. 20-30)" requiredCompletion="70" isOneTime="true">
<!-- Kill 70 monsters in the following hunting zones: Ruins of Agony, Abandoned Camp. -->
<handler name="monster">
@ -433,9 +427,6 @@
<item id="91931" count="1" /> <!-- Adventurer's Mark Lv.5 -->
</items>
</reward>
<!-- One Time Level Reach Missions -->
<reward id="4001" reward_id="1078" name="Reach Level 20" requiredCompletion="20">
<!-- One-time mission. A reward is given when the character reaches Lv. 20. -->
<handler name="level">
@ -510,8 +501,6 @@
<item id="91910" count="5" /> <!-- Sayha's Blessing - Lv. 1-75 -->
</items>
</reward>
<reward id="4005" reward_id="1082" name="Reach Level 50" requiredCompletion="50">
<!-- One-time mission. A reward is given when the character reaches Lv. 50. -->
<handler name="level">
@ -749,319 +738,139 @@
<item id="94765" count="1" /> <!-- Lv. 90 Achievement Reward Box -->
</items>
</reward>
<!-- TODO: Clan handler
<reward id="1023" reward_id="501" name="Joining a Clan" requiredCompletion="1">
One-time mission. A reward is given when joining a clan for the first time.
<handler name="siege">
<param name="minLevel">40</param>
<param name="maxLevel">99</param>
<reward id="4026" reward_id="4026" name="Reach Level 91" requiredCompletion="91">
<!-- One-time mission. A reward is given when you reach Lv. 91.-->
<handler name="level">
<param name="level">91</param>
</handler>
<items>
<item id="90768" count="1" /> Hair Accessory Coupon
<item id="94269" count="30" /> <!-- Scroll: Boost Attack -->
<item id="94271" count="30" /> <!-- Scroll: Boost Defense -->
<item id="49674" count="30" /> <!-- XP Growth Scroll -->
<item id="94777" count="6" /> <!-- Berserker's Scroll -->
<item id="95888" count="1" /> <!-- Lv. 91 Achievement Reward Box -->
</items>
</reward>
-->
<!-- TODO: spiritevolve handler
<reward id="1112" reward_id="508" name="Fire Spirit Lv. 3" requiredCompletion="3">
One-time mission. A reward is given when evolving the Fire Spirit up to Lv. 3.
<handler name="spiritevolve">
<param name="element">FIRE</param>
<reward id="4027" reward_id="4027" name="Reach Level 92" requiredCompletion="92">
<!-- One-time mission. A reward is given when you reach Lv. 92.-->
<handler name="level">
<param name="level">92</param>
</handler>
<items>
<item id="91185" count="30" /> Mid-grade Spirit's Blessing
</items>
</reward>
<reward id="1113" reward_id="509" name="Water Spirit Lv. 3" requiredCompletion="3">
One-time mission. A reward is given when evolving the Water Spirit up to Lv. 3.
<handler name="spiritevolve">
<param name="element">WATER</param>
</handler>
<items>
<item id="91185" count="30" /> Mid-grade Spirit's Blessing
</items>
</reward>
<reward id="1114" reward_id="510" name="Wind Spirit Lv. 3" requiredCompletion="3">
One-time mission. A reward is given when evolving the Wind Spirit up to Lv. 3.
<handler name="spiritevolve">
<param name="element">WIND</param>
</handler>
<items>
<item id="91185" count="30" /> Mid-grade Spirit's Blessing
</items>
</reward>
<reward id="1115" reward_id="511" name="Earth Spirit Lv. 3" requiredCompletion="3">
One-time mission. A reward is given when evolving the Earth Spirit up to Lv. 3.
<handler name="spiritevolve">
<param name="element">EARTH</param>
</handler>
<items>
<item id="91185" count="30" /> Mid-grade Spirit's Blessing
</items>
</reward>
-->
<!-- TODO: Weekly monster handler
<reward id="1116" reward_id="118" name="Attribute monsters hunting" requiredCompletion="1800">
A reward is given once a week for elemental monster hunting.
<handler name="monster">
<param name="ids">20792,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20849,20995,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21678,21685,21686,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832</param>
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="91030" count="10" /> Blessed Soul
<item id="97224" count="10" /> Mission Points
</items>
</reward>
-->
<!-- TODO: spiritevolve handler
<reward id="1160" reward_id="2029" name="Hunt in the Tower of Insolence I (Lv. 74+)" requiredCompletion="300">
Daily mission. A reward is given for killing 300 monsters in the Tower of Insolence. Required level: 74+.
<handler name="monster">
<param name="minLevel">74</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="91971" count="2" /> Star Candy
</items>
</reward>
<reward id="1161" reward_id="2030" name="Hunt in the Tower of Insolence II (Lv. 74+)" requiredCompletion="300">
Daily mission. A reward is given for killing 300 elite monsters in the Tower of Insolence. Required level: 74+.
<handler name="monster">
<param name="minLevel">74</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="94269" count="2" /> Scroll: Boost Attack
<item id="91971" count="2" /> Star Candy
</items>
</reward>
<reward id="1162" reward_id="2031" name="Fire Spirit Lv. 5" requiredCompletion="5">
One-time quest. A reward is given when evolving the Fire Spirit up to Lv. 5.
<handler name="spiritevolve">
<param name="element">FIRE</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1163" reward_id="2032" name="Water Spirit Lv. 5" requiredCompletion="5">
One-time quest. A reward is given when evolving the Water Spirit up to Lv. 5.
<handler name="spiritevolve">
<param name="element">WATER</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1164" reward_id="2033" name="Wind Spirit Lv. 5" requiredCompletion="5">
One-time quest. A reward is given when evolving the Wind Spirit up to Lv. 5.
<handler name="spiritevolve">
<param name="element">WIND</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1165" reward_id="2034" name="Earth Spirit Lv. 5" requiredCompletion="5">
One-time quest. A reward is given when evolving the Earth Spirit up to Lv. 5.
<handler name="spiritevolve">
<param name="element">EARTH</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1500" reward_id="1500" name="Hunt in Transcendent Instance Zones" requiredCompletion="300">
Daily mission (once per account). A reward is given for killing 300 monsters in transcendent instance zones.
<handler name="monster">
<param name="minLevel">40</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="93274" count="100" /> Sayha's Cookie Sealed
<item id="97224" count="20" /> Mission Points
<item id="97145" count="50" /> Ancient Adena
</items>
</reward>
-->
<reward id="1501" reward_id="2040" name="Hunt on Alligator Island I (Lv. 60+)" requiredCompletion="100">
<!-- A reward is given for killing 100 Savage monsters on Alligator Island. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="93080" count="1" /> <!-- Charging Stone of Random Craft - 1 Charge -->
</items>
</reward>
<reward id="1502" reward_id="2041" name="Hunt on Alligator Island II (Lv. 60+)" requiredCompletion="200">
<!-- A reward is given for killing 200 Savage monsters on Alligator Island. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="93080" count="1" /> <!-- Charging Stone of Random Craft - 1 Charge -->
</items>
</reward>
<!-- TODO:
<reward id="1503" reward_id="1503" name="Explore Primeval Isle" requiredCompletion="200">
A reward is given for killing 200 monsters on the Primeval Isle.
<handler name="monster">
<param name="minLevel">79</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="94879" count="50" /> Grace PotionSealed
<item id="97224" count="20" /> Mission Points
</items>
</reward>
<reward id="1505" reward_id="1505" name="Monster Purge" requiredCompletion="1">
A reward is given after receiving the reward for using the Purge system in the corresponding hunting zones.
TODO: Make handler [on purge reward receive]
<items>
<item id="94879" count="1" /> Aden Purge Crystal Sealed
<item id="97224" count="20" /> Mission Points
</items>
</reward>
<reward id="1509" reward_id="1509" name="Exploring Dreamland" requiredCompletion="1">
reset_period=2
A reward is given for killing one of the following monsters in the Dream Dungeon: Gustav, Gustav's Steward, Gabrielle, Gabrielle's Minion, Ventus, Rekario, Tiat, Baint. / Kill 1 raid boss in one of the four dungeons.
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> Dream Orb Sealed
<item id="93068" count="1" /> Red Lantern - 1st Place Sealed
<item id="97224" count="5" /> Mission Points
<item id="97145" count="100" /> Ancient Adena
</items>
</reward>
<reward id="1510" reward_id="1510" name="Exploring Dreamland's Secret Places" requiredCompletion="1">
reset_period=2
A reward is given for killing Feline King or Feline Queen in the Cat Guild's Lair of the Dream Dungeon. / Kill 1 raid boss in the Cat Guild's dungeon.
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> Dream Orb Sealed
</items>
</reward>
<reward id="1511" reward_id="1511" name="Exploring Alligator Island" requiredCompletion="100">
reset_period=2
A reward is given for killing 100 Evolved monsters on Alligator Island. / Kill 100 Evolved monsters.
<handler name="monster">
<param name="minLevel">70</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> Dream Orb Sealed
<item id="94269" count="36" /> <!-- Scroll: Boost Attack -->
<item id="94271" count="36" /> <!-- Scroll: Boost Defense -->
<item id="49674" count="36" /> <!-- XP Growth Scroll -->
<item id="94777" count="7" /> <!-- Berserker's Scroll -->
<item id="95889" count="1" /> <!-- Lv. 92 Achievement Reward Box -->
</items>
</reward>
<reward id="3007" reward_id="3007" name="Sayha's Blessing" requiredCompletion="10">
A reward is given for using Sayha's Blessing that is not limited by level, 10 times.
<handler name="item">
<!-- A reward is given for using Sayha's Blessing that is not limited by level, 10 times. -->
<handler name="useItem">
<param name="maxUse">10</param>
<param name="id">91910</param>
</handler>
<items>
<item id="94780" count="2" /> Growth Rune Fragment Sealed
<item id="97224" count="5" /> Mission Points
<item id="94780" count="2" /> <!-- Growth Rune Fragment Sealed -->
<item id="97224" count="5" /> <!-- Mission Points -->
</items>
</reward>
<reward id="1171" reward_id="1171" name="Assault on the Transcendent Instance Zones" requiredCompletion="300">
Daily mission (once per account). A reward is given for killing 300 monsters in a Transcendent Instance Zone.
<reward id="1500" reward_id="1500" name="Hunt in Transcendent Instance Zones" requiredCompletion="300">
<!-- Daily mission (once per account). A reward is given for killing 300 monsters in transcendent instance zones. -->
<handler name="monster">
<param name="minLevel">40</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="93274" count="100" /> <!-- Sayha's Cookie Sealed -->
<item id="97224" count="20" /> <!-- Mission Points -->
<item id="97145" count="50" /> <!-- Ancient Adena -->
</items>
</reward>
<reward id="3019" reward_id="3011" name="Difficult Assault on the Orc Fortress" requiredCompletion="1">
<!-- A reward is given for killing titled monsters during the battle for the Orc Fortress. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="93068" count="1" /> <!-- Red Lantern -->
<item id="49674" count="3" /> <!-- XP Growth Scroll -->
</items>
</reward>
<reward id="3020" reward_id="3012" name="Assault on Orc Fortress" requiredCompletion="50">
<!-- A reward is given for killing titleless monsters during the battle for the Orc Fortress. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="93070" count="5" /> <!-- Blue Lantern -->
<item id="49674" count="2" /> <!-- XP Growth Scroll -->
</items>
</reward>
<reward id="3013" reward_id="3013" name="3 vs 3 Olympiad Winner I" requiredCompletion="1">
<!-- One-time mission. A reward is given for winning a 3 vs 3 Olympiad match. Not available on Sundays. -->
<handler name="olympiad" />
<items>
<item id="92991" count="3" /> <!-- Einhasad's Blessing Scroll -->
</items>
</reward>
<reward id="3014" reward_id="3014" name="3 vs 3 Olympiad Winner II" requiredCompletion="2">
<!-- One-time mission. A reward is given for winning 2 of 3 vs 3 Olympiad matches. Not available on Sundays. -->
<handler name="olympiad" />
<items>
<item id="91690" count="50" /> <!-- Special HP Recovery Potion -->
</items>
</reward>
<reward id="3015" reward_id="3015" name="3 vs 3 Olympiad Winner III" requiredCompletion="3">
<!-- One-time mission. A reward is given for winning 3 of 3 vs 3 Olympiad matches. Not available on Sundays. -->
<handler name="olympiad" />
<items>
<item id="92991" count="5" /> <!-- Einhasad's Blessing Scroll -->
</items>
</reward>
<reward id="3016" reward_id="3016" name="3 vs 3 Olympiad Winner IV" requiredCompletion="4">
<!-- One-time mission. A reward is given for winning 4 of 3 vs 3 Olympiad matches. Not available on Sundays. -->
<handler name="olympiad" />
<items>
<item id="91690" count="100" /> <!-- Special HP Recovery Potion -->
</items>
</reward>
<reward id="3017" reward_id="3017" name="3 vs 3 Olympiad Winner V" requiredCompletion="5">
<!-- One-time mission. A reward is given for winning 5 of 3 vs 3 Olympiad matches. Not available on Sundays. -->
<handler name="olympiad" />
<items>
<item id="93290" count="1" /> <!-- Victory Pack -->
</items>
</reward>
<reward id="3018" reward_id="3018" name="Olympiad Competitor" requiredCompletion="50">
<!-- A reward is given when player will participating in 50 Olympiad matches in a month. Available from monday to friday. -->
<handler name="olympiad" />
<items>
<item id="97224" count="150" /> <!-- Mission Points -->
<item id="95687" count="1" /> <!-- Olympiad Treasure Chest Sealed -->
</items>
</reward>
<reward id="1017" reward_id="117" name="In-game Weekend" requiredCompletion="1">
<!-- Weekly mission. A reward is given for playing the game on Saturday or Sunday. -->
<handler name="loginweekend" />
<items>
<item id="94269" count="1" /> <!-- -->
<item id="3031" count="50" /> <!-- -->
</items>
</reward>
<reward id="1023" reward_id="501" name="Joining a Clan" requiredCompletion="1">
<!-- One-time mission. A reward is given when joining a clan for the first time. -->
<handler name="joinclan">
<param name="minLevel">40</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="90907" count="10" /> Soulshot Ticket
<item id="3031" count="50" /> Spirit Ore
<item id="93274" count="3" /> Sayha's Cookie
<item id="90768" count="1" /> <!-- Hair Accessory Coupon -->
</items>
</reward>
<reward id="3019" reward_id="3011" name="Difficult Assault on the Orc Fortress" requiredCompletion="1">
A reward is given for killing titled monsters during the battle for the Orc Fortress.
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="93068" count="1" /> Red Lantern
<item id="49674" count="3" /> XP Growth Scroll
</items>
</reward>
<reward id="3020" reward_id="3012" name="Assault on Orc Fortress" requiredCompletion="50">
A reward is given for killing titleless monsters during the battle for the Orc Fortress.
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="93070" count="5" /> Blue Lantern
<item id="49674" count="2" /> XP Growth Scroll
</items>
</reward>
<reward id="3013" reward_id="3013" name="3 vs 3 Olympiad Winner I" requiredCompletion="1">
One-time mission. A reward is given for winning a 3 vs 3 Olympiad match. Not available on Sundays.
<handler name="olympiad" />
<items>
<item id="92991" count="3" /> Einhasad's Blessing Scroll
</items>
</reward>
<reward id="3014" reward_id="3014" name="3 vs 3 Olympiad Winner II" requiredCompletion="2">
One-time mission. A reward is given for winning 2 of 3 vs 3 Olympiad matches. Not available on Sundays.
<handler name="olympiad" />
<items>
<item id="91690" count="50" /> Special HP Recovery Potion
</items>
</reward>
<reward id="3015" reward_id="3015" name="3 vs 3 Olympiad Winner III" requiredCompletion="3">
One-time mission. A reward is given for winning 3 of 3 vs 3 Olympiad matches. Not available on Sundays.
<handler name="olympiad" />
<items>
<item id="92991" count="5" /> Einhasad's Blessing Scroll
</items>
</reward>
<reward id="3016" reward_id="3016" name="3 vs 3 Olympiad Winner IV" requiredCompletion="4">
One-time mission. A reward is given for winning 4 of 3 vs 3 Olympiad matches. Not available on Sundays.
<handler name="olympiad" />
<items>
<item id="91690" count="100" /> Special HP Recovery Potion
</items>
</reward>
<reward id="3017" reward_id="3017" name="3 vs 3 Olympiad Winner V" requiredCompletion="5">
One-time mission. A reward is given for winning 5 of 3 vs 3 Olympiad matches. Not available on Sundays.
<handler name="olympiad" />
<items>
<item id="93290" count="1" /> Victory Pack
</items>
</reward>
<reward id="3018" reward_id="3018" name="Olympiad Percipient" requiredCompletion="50">
A reward is given when player will percipient in Olympiad, 50 times. Available from monday to friday.
<handler name="olympiad" />
<items>
<item id="97224" count="150" /> Mission Points
<item id="95687" count="1" /> Olympiad Treasure Chest Sealed
</items>
</reward>
-->
<reward id="9001" reward_id="9001" name="Clan Raid Attack" requiredCompletion="1">
<!-- Weekly mission. A reward is given for defeating 1 enemy together with your clan members in the Clan Arena. -->
<handler name="monster">
@ -1105,74 +914,313 @@
<item id="91830" count="5" /> <!-- Improved Fire Attack Potion -->
</items>
</reward>
<!-- TODO: FIND ID
<reward id="9004" reward_id="9004" name="Battle with Frintezza" requiredCompletion="1">
Weekly mission. A reward is given for defeating Scarlet van Halisha during a command channel raid to Frintezza.
<!-- Weekly mission. A reward is given for defeating Scarlet van Halisha during a command channel raid to Frintezza. -->
<handler name="monster">
<param name="ids">22271,22272,22273</param>
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="90907" count="20" /> Soulshot Ticket Sealed
<item id="3031" count="200" /> Spirit Ore Sealed
<item id="94481" count="200" /> Clan XP Sealed
<item id="94879" count="300" /> Grace Potion Sealed
<item id="97145" count="20" /> Ancient Adena
<item id="97224" count="10" /> Mission Points
<item id="90907" count="20" /> <!-- Soulshot Ticket Sealed -->
<item id="3031" count="200" /> <!-- Spirit Ore Sealed -->
<item id="94481" count="200" /> <!-- Clan XP Sealed -->
<item id="94879" count="300" /> <!-- Grace Potion Sealed -->
<item id="97145" count="20" /> <!-- Ancient Adena -->
<item id="97224" count="10" /> <!-- Mission Points -->
</items>
</reward>
<reward id="5036" reward_id="5036" name="Assault on Elmoreden Tower" requiredCompletion="50">
Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 60-74.
<handler name="monster">
<param name="ids">22271,22272,22273</param>
<param name="minLevel">60</param>
<param name="maxLevel">74</param>
<reward id="1112" reward_id="508" name="Fire Spirit Lv. 3" requiredCompletion="3">
<!-- One-time mission. A reward is given when evolving the Fire Spirit up to Lv. 3. -->
<handler name="spiritevolve">
<param name="element">FIRE</param>
</handler>
<items>
<item id="91671" count="1" /> Green Lantern (Time-limited) Sealed
<item id="97247" count="1" /> Asofe Sealed
<item id="97224" count="20" /> Mission Points
<item id="91185" count="30" /> <!-- Mid-grade Spirit's Blessing -->
</items>
</reward>
<reward id="5037" reward_id="5037" name="Assault on Elmoreden Tower" requiredCompletion="50">
Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 75-79.
<handler name="monster">
<param name="ids">22271,22272,22273</param>
<param name="minLevel">75</param>
<param name="maxLevel">79</param>
<reward id="1113" reward_id="509" name="Water Spirit Lv. 3" requiredCompletion="3">
<!-- One-time mission. A reward is given when evolving the Water Spirit up to Lv. 3. -->
<handler name="spiritevolve">
<param name="element">WATER</param>
</handler>
<items>
<item id="91671" count="1" /> Green Lantern (Time-limited) Sealed
<item id="97247" count="3" /> Asofe Sealed
<item id="97224" count="20" /> Mission Points
<item id="91185" count="30" /> <!-- Mid-grade Spirit's Blessing -->
</items>
</reward>
<reward id="5038" reward_id="5038" name="Assault on Elmoreden Tower" requiredCompletion="50">
Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 80-84.
<handler name="monster">
<param name="ids">22271,22272,22273</param>
<param name="minLevel">80</param>
<param name="maxLevel">84</param>
<reward id="1114" reward_id="510" name="Wind Spirit Lv. 3" requiredCompletion="3">
<!-- One-time mission. A reward is given when evolving the Wind Spirit up to Lv. 3. -->
<handler name="spiritevolve">
<param name="element">WIND</param>
</handler>
<items>
<item id="91671" count="1" /> Green Lantern (Time-limited) Sealed
<item id="97247" count="5" /> Asofe Sealed
<item id="97224" count="20" /> Mission Points
<item id="91185" count="30" /> <!-- Mid-grade Spirit's Blessing -->
</items>
</reward>
<reward id="5038" reward_id="5038" name="Assault on Elmoreden Tower" requiredCompletion="50">
Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 85+.
<reward id="1115" reward_id="511" name="Earth Spirit Lv. 3" requiredCompletion="3">
<!-- One-time mission. A reward is given when evolving the Earth Spirit up to Lv. 3. -->
<handler name="spiritevolve">
<param name="element">EARTH</param>
</handler>
<items>
<item id="91185" count="30" /> <!-- Mid-grade Spirit's Blessing -->
</items>
</reward>
<reward id="1162" reward_id="2031" name="Fire Spirit Lv. 5" requiredCompletion="5">
<!-- One-time quest. A reward is given when evolving the Fire Spirit up to Lv. 5. -->
<handler name="spiritevolve">
<param name="element">FIRE</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1163" reward_id="2032" name="Water Spirit Lv. 5" requiredCompletion="5">
<!-- One-time quest. A reward is given when evolving the Water Spirit up to Lv. 5. -->
<handler name="spiritevolve">
<param name="element">WATER</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1164" reward_id="2033" name="Wind Spirit Lv. 5" requiredCompletion="5">
<!-- One-time quest. A reward is given when evolving the Wind Spirit up to Lv. 5. -->
<handler name="spiritevolve">
<param name="element">WIND</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1165" reward_id="2034" name="Earth Spirit Lv. 5" requiredCompletion="5">
<!-- One-time quest. A reward is given when evolving the Earth Spirit up to Lv. 5. -->
<handler name="spiritevolve">
<param name="element">EARTH</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1116" reward_id="118" name="Attribute monsters hunting" requiredCompletion="1800">
<!-- A reward is given once a week for elemental monster hunting. -->
<handler name="monster">
<param name="ids">22271,22272,22273</param>
<param name="minLevel">85</param>
<param name="ids">20792,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20849,20995,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21678,21685,21686,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832</param>
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="91671" count="1" /> Green Lantern (Time-limited) Sealed
<item id="97247" count="7" /> Asofe Sealed
<item id="97224" count="20" /> Mission Points
<item id="91030" count="10" /> <!-- Blessed Soul -->
<item id="97224" count="10" /> <!-- Mission Points -->
</items>
</reward>
<reward id="1503" reward_id="1503" name="Explore Primeval Isle" requiredCompletion="200">
<!-- A reward is given for killing 200 monsters on the Primeval Isle. -->
<handler name="monster">
<param name="minLevel">79</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="94879" count="50" /> <!-- Grace PotionSealed -->
<item id="97224" count="20" /> <!-- Mission Points -->
</items>
</reward>
<reward id="5036" reward_id="5036" name="Assault on Elmoreden Tower" requiredCompletion="50">
<!-- Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 60-74. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">74</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="91671" count="1" /> <!-- -->
<item id="97247" count="1" /> <!-- -->
<item id="97224" count="20" /> <!-- -->
</items>
</reward>
<reward id="5037" reward_id="5037" name="Assault on Elmoreden Tower" requiredCompletion="50">
<!-- Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 75-79. -->
<handler name="monster">
<param name="minLevel">75</param>
<param name="maxLevel">79</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="91670" count="1" /> <!-- -->
<item id="97247" count="3" /> <!-- -->
<item id="97224" count="20" /> <!-- -->
</items>
</reward>
<reward id="5038" reward_id="5038" name="Assault on Elmoreden Tower" requiredCompletion="50">
<!-- Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 80-84. -->
<handler name="monster">
<param name="minLevel">80</param>
<param name="maxLevel">84</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="91669" count="2" /> <!-- -->
<item id="97247" count="5" /> <!-- -->
<item id="97224" count="20" /> <!-- -->
</items>
</reward>
<reward id="5039" reward_id="5039" name="Assault on Elmoreden Tower" requiredCompletion="50">
<!-- Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 85+. -->
<handler name="monster">
<param name="minLevel">85</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="91668" count="2" /> <!-- -->
<item id="97247" count="7" /> <!-- -->
<item id="97224" count="20" /> <!-- -->
</items>
</reward>
<reward id="1505" reward_id="1505" name="Monster Purge" requiredCompletion="1">
<!-- A reward is given after receiving the reward for using the Purge system in the corresponding hunting zones. -->
<handler name="purge" />
<items>
<item id="94879" count="1" /> <!-- Aden Purge Crystal Sealed -->
<item id="97224" count="20" /> <!-- Mission Points -->
</items>
</reward>
<reward id="1506" reward_id="1506" name="Forgotten Primeval Garden I" requiredCompletion="100">
<!-- A reward is given for killing 100 Swift Hunter monsters in Forgotten Primeval Garden. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="92459" count="1" /> <!-- -->
<item id="97246" count="5" /> <!-- -->
</items>
</reward>
<reward id="1507" reward_id="1507" name="Forgotten Primeval Garden II" requiredCompletion="300">
<!-- A reward is given for killing 300 Swift Hunter monsters in Forgotten Primeval Garden. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="92459" count="2" /> <!-- -->
</items>
</reward>
<reward id="1508" reward_id="1508" name="Forgotten Primeval Garden III" requiredCompletion="1000">
<!-- A reward is given for killing 1000 Swift Hunter monsters in Forgotten Primeval Garden. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96787" count="4" /> <!-- -->
<item id="97145" count="100" /> <!-- -->
</items>
</reward>
<reward id="1509" reward_id="1509" name="Exploring Dreamland" requiredCompletion="1">
<!-- A reward is given for killing one of the following monsters in the Dream Dungeon: Gustav, Gustav's Steward, Gabrielle, Gabrielle's Minion, Ventus, Rekario, Tiat, Baint. / Kill 1 raid boss in one of the four dungeons. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> <!-- Dream Orb Sealed -->
<item id="93068" count="1" /> <!-- Red Lantern - 1st Place Sealed -->
<item id="97224" count="5" /> <!-- Mission Points -->
<item id="97145" count="100" /> <!-- Ancient Adena -->
</items>
</reward>
<reward id="1510" reward_id="1510" name="Exploring Dreamland's Secret Places" requiredCompletion="1">
<!-- A reward is given for killing Feline King or Feline Queen in the Cat Guild's Lair of the Dream Dungeon. / Kill 1 raid boss in the Cat Guild's dungeon. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> <!-- Dream Orb Sealed -->
</items>
</reward>
<reward id="1511" reward_id="1511" name="Exploring Alligator Island" requiredCompletion="100">
<!-- A reward is given for killing 100 Evolved monsters on Alligator Island. / Kill 100 Evolved monsters. -->
<handler name="monster">
<param name="minLevel">70</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> <!-- Dream Orb Sealed -->
</items>
</reward>
<reward id="1512" reward_id="1512" name="Incessant Training" requiredCompletion="1">
<!-- A reward is given for killing one of the following monsters in the Training Zone: Boojudu, Petron, Kerion, Furious Tukhak, Rilva, Ryun, Chel. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="97145" count="50" /> <!-- -->
</items>
</reward>
<reward id="1513" reward_id="1513" name="Combat on Balok Battleground" requiredCompletion="10">
<!-- A reward is given for killing 10 monsters on the Balok Battleground. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="97145" count="50" /> <!-- -->
</items>
</reward>
<reward id="1514" reward_id="1514" name="Explore Goddard" requiredCompletion="1000">
<!-- A reward is given for killing 1000 monsters in the Gorde Canyon, Morgos' Military Base, Xilenos Fortress, Hot Springs. -->
<handler name="monster">
<param name="minLevel">85</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="97145" count="100" /> <!-- -->
</items>
</reward>
<reward id="1515" reward_id="1515" name="Explore Antharas' Lair" requiredCompletion="300">
<!-- A reward is given for killing 300 monsters in Antharas' Lair. -->
<handler name="monster">
<param name="minLevel">85</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="97246" count="10" /> <!-- -->
</items>
</reward>
<reward id="1516" reward_id="1516" name="Explore Frost Lord's Castle" requiredCompletion="300">
<!-- A reward is given for killing 300 monsters in Frost Lord's Castle. -->
<handler name="monster">
<param name="minLevel">85</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="97246" count="10" /> <!-- -->
</items>
</reward>
<reward id="5033" reward_id="5033" name="Ephemeral Frozen Canyon" requiredCompletion="50">
<!-- Daily mission (once per account). A reward is given for killing 50 monsters in the Frozen Canyon during the event. -->
<handler name="monster">
<param name="minLevel">65</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="95836" count="50" /> <!-- Dream Orb Sealed -->
</items>
</reward>
-->
</list>

View File

@ -28,9 +28,11 @@ import handlers.dailymissionhandlers.LoginMonthDailyMissionHandler;
import handlers.dailymissionhandlers.LoginWeekendDailyMissionHandler;
import handlers.dailymissionhandlers.MonsterDailyMissionHandler;
import handlers.dailymissionhandlers.OlympiadDailyMissionHandler;
import handlers.dailymissionhandlers.PurgeRewardDailyMissionHandler;
import handlers.dailymissionhandlers.QuestDailyMissionHandler;
import handlers.dailymissionhandlers.SiegeDailyMissionHandler;
import handlers.dailymissionhandlers.SpiritDailyMissionHandler;
import handlers.dailymissionhandlers.UseItemDailyMissionHandler;
/**
* @author UnAfraid
@ -52,6 +54,8 @@ public class DailyMissionMasterHandler
DailyMissionHandler.getInstance().registerHandler("fishing", FishingDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("spirit", SpiritDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("joinclan", JoinClanDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("purge", PurgeRewardDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("useitem", UseItemDailyMissionHandler::new);
LOGGER.info(DailyMissionMasterHandler.class.getSimpleName() + ": Loaded " + DailyMissionHandler.getInstance().size() + " handlers.");
}
}

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

@ -16,13 +16,15 @@
*/
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;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.CommandChannel;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
@ -44,7 +46,8 @@ public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
private final int _minLevel;
private final int _maxLevel;
private final Set<Integer> _ids = new HashSet<>();
private final ElementalType _element;
private final String _startHour;
private final String _endHour;
public MonsterDailyMissionHandler(DailyMissionDataHolder holder)
{
@ -52,7 +55,6 @@ public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
_element = holder.getParams().getEnum("element", ElementalType.class, ElementalType.NONE);
final String ids = holder.getParams().getString("ids", "");
if (!ids.isEmpty())
{
@ -65,6 +67,8 @@ public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
}
}
}
_startHour = holder.getParams().getString("startHour", "");
_endHour = holder.getParams().getString("endHour", "");
}
@Override
@ -113,28 +117,25 @@ public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
{
return;
}
if ((_element != ElementalType.NONE) && (monster.getElementalSpiritType() != _element))
if (checkTimeInterval() || ((_startHour == "") && (_endHour == "")))
{
return;
}
final Party party = player.getParty();
if (party != null)
{
final CommandChannel channel = party.getCommandChannel();
final List<Player> members = channel != null ? channel.getMembers() : party.getMembers();
for (Player member : members)
final Party party = player.getParty();
if (party != null)
{
if ((member.getLevel() >= (monsterLevel - 5)) && (member.calculateDistance3D(monster) <= Config.ALT_PARTY_RANGE))
final CommandChannel channel = party.getCommandChannel();
final List<Player> members = channel != null ? channel.getMembers() : party.getMembers();
for (Player member : members)
{
processPlayerProgress(member);
if ((member.getLevel() >= (monsterLevel - 5)) && (member.calculateDistance3D(monster) <= Config.ALT_PARTY_RANGE))
{
processPlayerProgress(member);
}
}
}
}
else
{
processPlayerProgress(player);
else
{
processPlayerProgress(player);
}
}
}
@ -150,4 +151,28 @@ 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;
}
}

View File

@ -0,0 +1,100 @@
/*
* 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.item.OnItemPurgeReward;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class PurgeRewardDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
public PurgeRewardDailyMissionHandler(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_ITEM_PURGE_REWARD, (OnItemPurgeReward event) -> onItemPurgeReward(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 onItemPurgeReward(OnItemPurgeReward event)
{
final Player player = event.getPlayer();
if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
{
return;
}
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,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

@ -37,7 +37,11 @@ import org.l2jmobius.gameserver.model.Message;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemPurgeReward;
import org.l2jmobius.gameserver.model.holders.PurgePlayerHolder;
import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.itemcontainer.Mail;
import org.l2jmobius.gameserver.network.serverpackets.subjugation.ExSubjugationSidebar;
@ -138,6 +142,17 @@ public class PurgeRankingManager
attachment.addItem("Purge reward", reward, 5 - counter, null, null);
MailManager.getInstance().sendMessage(msg);
// Notify to scripts.
final Player player = World.getInstance().getPlayer(charId);
final Item item = attachment.getItemByItemId(reward);
if (player != null)
{
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_PURGE_REWARD))
{
EventDispatcher.getInstance().notifyEventAsync(new OnItemPurgeReward(player, item));
}
}
try (Connection con = DatabaseFactory.getConnection())
{
try (PreparedStatement st = con.prepareStatement(DELETE_SUBJUGATION))

View File

@ -126,6 +126,7 @@ import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceLeave;
import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceStatusChange;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemBypassEvent;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemPurgeReward;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemTalk;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemUse;
import org.l2jmobius.gameserver.model.events.impl.olympiad.OnOlympiadMatchResult;
@ -185,6 +186,7 @@ public enum EventType
ON_ITEM_CREATE(OnItemCreate.class, void.class),
ON_ITEM_USE(OnItemUse.class, void.class),
ON_ITEM_TALK(OnItemTalk.class, void.class),
ON_ITEM_PURGE_REWARD(OnItemPurgeReward.class, void.class),
// NPC events
ON_NPC_CAN_BE_SEEN(OnNpcCanBeSeen.class, void.class, TerminateReturn.class),

View File

@ -0,0 +1,53 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.item;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.instance.Item;
/**
* @author CostyKiller
*/
public class OnItemPurgeReward implements IBaseEvent
{
private final Player _player;
private final Item _item;
public OnItemPurgeReward(Player player, Item item)
{
_player = player;
_item = item;
}
public Player getPlayer()
{
return _player;
}
public Item getItem()
{
return _item;
}
@Override
public EventType getType()
{
return EventType.ON_ITEM_PURGE_REWARD;
}
}

View File

@ -1,8 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/DailyMission.xsd">
<!-- Daily Repeatable Missions -->
<reward id="2001" reward_id="2001" name="Daily Hunting I (Lv. 21-40)" requiredCompletion="30" isOneTime="false">
<!-- Daily mission. A reward is given for killing any 30 monsters. Monsters whose level is lower than the character's for more than 10 levels do not count. -->
<handler name="monster">
@ -380,9 +377,6 @@
<item id="97145" count="30" /> <!-- Ancient Adena -->
</items>
</reward>
<!-- One Time Missions -->
<reward id="1141" reward_id="827" name="Adventurer's Journey I (Lv. 20-30)" requiredCompletion="70" isOneTime="true">
<!-- Kill 70 monsters in the following hunting zones: Ruins of Agony, Abandoned Camp. -->
<handler name="monster">
@ -433,9 +427,6 @@
<item id="91931" count="1" /> <!-- Adventurer's Mark Lv.5 -->
</items>
</reward>
<!-- One Time Level Reach Missions -->
<reward id="4001" reward_id="1078" name="Reach Level 20" requiredCompletion="20">
<!-- One-time mission. A reward is given when the character reaches Lv. 20. -->
<handler name="level">
@ -510,8 +501,6 @@
<item id="91910" count="5" /> <!-- Sayha's Blessing - Lv. 1-75 -->
</items>
</reward>
<reward id="4005" reward_id="1082" name="Reach Level 50" requiredCompletion="50">
<!-- One-time mission. A reward is given when the character reaches Lv. 50. -->
<handler name="level">
@ -749,319 +738,139 @@
<item id="94765" count="1" /> <!-- Lv. 90 Achievement Reward Box -->
</items>
</reward>
<!-- TODO: Clan handler
<reward id="1023" reward_id="501" name="Joining a Clan" requiredCompletion="1">
One-time mission. A reward is given when joining a clan for the first time.
<handler name="siege">
<param name="minLevel">40</param>
<param name="maxLevel">99</param>
<reward id="4026" reward_id="4026" name="Reach Level 91" requiredCompletion="91">
<!-- One-time mission. A reward is given when you reach Lv. 91.-->
<handler name="level">
<param name="level">91</param>
</handler>
<items>
<item id="90768" count="1" /> Hair Accessory Coupon
<item id="94269" count="30" /> <!-- Scroll: Boost Attack -->
<item id="94271" count="30" /> <!-- Scroll: Boost Defense -->
<item id="49674" count="30" /> <!-- XP Growth Scroll -->
<item id="94777" count="6" /> <!-- Berserker's Scroll -->
<item id="95888" count="1" /> <!-- Lv. 91 Achievement Reward Box -->
</items>
</reward>
-->
<!-- TODO: spiritevolve handler
<reward id="1112" reward_id="508" name="Fire Spirit Lv. 3" requiredCompletion="3">
One-time mission. A reward is given when evolving the Fire Spirit up to Lv. 3.
<handler name="spiritevolve">
<param name="element">FIRE</param>
<reward id="4027" reward_id="4027" name="Reach Level 92" requiredCompletion="92">
<!-- One-time mission. A reward is given when you reach Lv. 92.-->
<handler name="level">
<param name="level">92</param>
</handler>
<items>
<item id="91185" count="30" /> Mid-grade Spirit's Blessing
</items>
</reward>
<reward id="1113" reward_id="509" name="Water Spirit Lv. 3" requiredCompletion="3">
One-time mission. A reward is given when evolving the Water Spirit up to Lv. 3.
<handler name="spiritevolve">
<param name="element">WATER</param>
</handler>
<items>
<item id="91185" count="30" /> Mid-grade Spirit's Blessing
</items>
</reward>
<reward id="1114" reward_id="510" name="Wind Spirit Lv. 3" requiredCompletion="3">
One-time mission. A reward is given when evolving the Wind Spirit up to Lv. 3.
<handler name="spiritevolve">
<param name="element">WIND</param>
</handler>
<items>
<item id="91185" count="30" /> Mid-grade Spirit's Blessing
</items>
</reward>
<reward id="1115" reward_id="511" name="Earth Spirit Lv. 3" requiredCompletion="3">
One-time mission. A reward is given when evolving the Earth Spirit up to Lv. 3.
<handler name="spiritevolve">
<param name="element">EARTH</param>
</handler>
<items>
<item id="91185" count="30" /> Mid-grade Spirit's Blessing
</items>
</reward>
-->
<!-- TODO: Weekly monster handler
<reward id="1116" reward_id="118" name="Attribute monsters hunting" requiredCompletion="1800">
A reward is given once a week for elemental monster hunting.
<handler name="monster">
<param name="ids">20792,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20849,20995,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21678,21685,21686,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832</param>
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="91030" count="10" /> Blessed Soul
<item id="97224" count="10" /> Mission Points
</items>
</reward>
-->
<!-- TODO: spiritevolve handler
<reward id="1160" reward_id="2029" name="Hunt in the Tower of Insolence I (Lv. 74+)" requiredCompletion="300">
Daily mission. A reward is given for killing 300 monsters in the Tower of Insolence. Required level: 74+.
<handler name="monster">
<param name="minLevel">74</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="91971" count="2" /> Star Candy
</items>
</reward>
<reward id="1161" reward_id="2030" name="Hunt in the Tower of Insolence II (Lv. 74+)" requiredCompletion="300">
Daily mission. A reward is given for killing 300 elite monsters in the Tower of Insolence. Required level: 74+.
<handler name="monster">
<param name="minLevel">74</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="94269" count="2" /> Scroll: Boost Attack
<item id="91971" count="2" /> Star Candy
</items>
</reward>
<reward id="1162" reward_id="2031" name="Fire Spirit Lv. 5" requiredCompletion="5">
One-time quest. A reward is given when evolving the Fire Spirit up to Lv. 5.
<handler name="spiritevolve">
<param name="element">FIRE</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1163" reward_id="2032" name="Water Spirit Lv. 5" requiredCompletion="5">
One-time quest. A reward is given when evolving the Water Spirit up to Lv. 5.
<handler name="spiritevolve">
<param name="element">WATER</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1164" reward_id="2033" name="Wind Spirit Lv. 5" requiredCompletion="5">
One-time quest. A reward is given when evolving the Wind Spirit up to Lv. 5.
<handler name="spiritevolve">
<param name="element">WIND</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1165" reward_id="2034" name="Earth Spirit Lv. 5" requiredCompletion="5">
One-time quest. A reward is given when evolving the Earth Spirit up to Lv. 5.
<handler name="spiritevolve">
<param name="element">EARTH</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1500" reward_id="1500" name="Hunt in Transcendent Instance Zones" requiredCompletion="300">
Daily mission (once per account). A reward is given for killing 300 monsters in transcendent instance zones.
<handler name="monster">
<param name="minLevel">40</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="93274" count="100" /> Sayha's Cookie Sealed
<item id="97224" count="20" /> Mission Points
<item id="97145" count="50" /> Ancient Adena
</items>
</reward>
-->
<reward id="1501" reward_id="2040" name="Hunt on Alligator Island I (Lv. 60+)" requiredCompletion="100">
<!-- A reward is given for killing 100 Savage monsters on Alligator Island. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="93080" count="1" /> <!-- Charging Stone of Random Craft - 1 Charge -->
</items>
</reward>
<reward id="1502" reward_id="2041" name="Hunt on Alligator Island II (Lv. 60+)" requiredCompletion="200">
<!-- A reward is given for killing 200 Savage monsters on Alligator Island. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="93080" count="1" /> <!-- Charging Stone of Random Craft - 1 Charge -->
</items>
</reward>
<!-- TODO:
<reward id="1503" reward_id="1503" name="Explore Primeval Isle" requiredCompletion="200">
A reward is given for killing 200 monsters on the Primeval Isle.
<handler name="monster">
<param name="minLevel">79</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="94879" count="50" /> Grace PotionSealed
<item id="97224" count="20" /> Mission Points
</items>
</reward>
<reward id="1505" reward_id="1505" name="Monster Purge" requiredCompletion="1">
A reward is given after receiving the reward for using the Purge system in the corresponding hunting zones.
TODO: Make handler [on purge reward receive]
<items>
<item id="94879" count="1" /> Aden Purge Crystal Sealed
<item id="97224" count="20" /> Mission Points
</items>
</reward>
<reward id="1509" reward_id="1509" name="Exploring Dreamland" requiredCompletion="1">
reset_period=2
A reward is given for killing one of the following monsters in the Dream Dungeon: Gustav, Gustav's Steward, Gabrielle, Gabrielle's Minion, Ventus, Rekario, Tiat, Baint. / Kill 1 raid boss in one of the four dungeons.
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> Dream Orb Sealed
<item id="93068" count="1" /> Red Lantern - 1st Place Sealed
<item id="97224" count="5" /> Mission Points
<item id="97145" count="100" /> Ancient Adena
</items>
</reward>
<reward id="1510" reward_id="1510" name="Exploring Dreamland's Secret Places" requiredCompletion="1">
reset_period=2
A reward is given for killing Feline King or Feline Queen in the Cat Guild's Lair of the Dream Dungeon. / Kill 1 raid boss in the Cat Guild's dungeon.
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> Dream Orb Sealed
</items>
</reward>
<reward id="1511" reward_id="1511" name="Exploring Alligator Island" requiredCompletion="100">
reset_period=2
A reward is given for killing 100 Evolved monsters on Alligator Island. / Kill 100 Evolved monsters.
<handler name="monster">
<param name="minLevel">70</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> Dream Orb Sealed
<item id="94269" count="36" /> <!-- Scroll: Boost Attack -->
<item id="94271" count="36" /> <!-- Scroll: Boost Defense -->
<item id="49674" count="36" /> <!-- XP Growth Scroll -->
<item id="94777" count="7" /> <!-- Berserker's Scroll -->
<item id="95889" count="1" /> <!-- Lv. 92 Achievement Reward Box -->
</items>
</reward>
<reward id="3007" reward_id="3007" name="Sayha's Blessing" requiredCompletion="10">
A reward is given for using Sayha's Blessing that is not limited by level, 10 times.
<handler name="item">
<!-- A reward is given for using Sayha's Blessing that is not limited by level, 10 times. -->
<handler name="useItem">
<param name="maxUse">10</param>
<param name="id">91910</param>
</handler>
<items>
<item id="94780" count="2" /> Growth Rune Fragment Sealed
<item id="97224" count="5" /> Mission Points
<item id="94780" count="2" /> <!-- Growth Rune Fragment Sealed -->
<item id="97224" count="5" /> <!-- Mission Points -->
</items>
</reward>
<reward id="1171" reward_id="1171" name="Assault on the Transcendent Instance Zones" requiredCompletion="300">
Daily mission (once per account). A reward is given for killing 300 monsters in a Transcendent Instance Zone.
<reward id="1500" reward_id="1500" name="Hunt in Transcendent Instance Zones" requiredCompletion="300">
<!-- Daily mission (once per account). A reward is given for killing 300 monsters in transcendent instance zones. -->
<handler name="monster">
<param name="minLevel">40</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="93274" count="100" /> <!-- Sayha's Cookie Sealed -->
<item id="97224" count="20" /> <!-- Mission Points -->
<item id="97145" count="50" /> <!-- Ancient Adena -->
</items>
</reward>
<reward id="3019" reward_id="3011" name="Difficult Assault on the Orc Fortress" requiredCompletion="1">
<!-- A reward is given for killing titled monsters during the battle for the Orc Fortress. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="93068" count="1" /> <!-- Red Lantern -->
<item id="49674" count="3" /> <!-- XP Growth Scroll -->
</items>
</reward>
<reward id="3020" reward_id="3012" name="Assault on Orc Fortress" requiredCompletion="50">
<!-- A reward is given for killing titleless monsters during the battle for the Orc Fortress. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="93070" count="5" /> <!-- Blue Lantern -->
<item id="49674" count="2" /> <!-- XP Growth Scroll -->
</items>
</reward>
<reward id="3013" reward_id="3013" name="3 vs 3 Olympiad Winner I" requiredCompletion="1">
<!-- One-time mission. A reward is given for winning a 3 vs 3 Olympiad match. Not available on Sundays. -->
<handler name="olympiad" />
<items>
<item id="92991" count="3" /> <!-- Einhasad's Blessing Scroll -->
</items>
</reward>
<reward id="3014" reward_id="3014" name="3 vs 3 Olympiad Winner II" requiredCompletion="2">
<!-- One-time mission. A reward is given for winning 2 of 3 vs 3 Olympiad matches. Not available on Sundays. -->
<handler name="olympiad" />
<items>
<item id="91690" count="50" /> <!-- Special HP Recovery Potion -->
</items>
</reward>
<reward id="3015" reward_id="3015" name="3 vs 3 Olympiad Winner III" requiredCompletion="3">
<!-- One-time mission. A reward is given for winning 3 of 3 vs 3 Olympiad matches. Not available on Sundays. -->
<handler name="olympiad" />
<items>
<item id="92991" count="5" /> <!-- Einhasad's Blessing Scroll -->
</items>
</reward>
<reward id="3016" reward_id="3016" name="3 vs 3 Olympiad Winner IV" requiredCompletion="4">
<!-- One-time mission. A reward is given for winning 4 of 3 vs 3 Olympiad matches. Not available on Sundays. -->
<handler name="olympiad" />
<items>
<item id="91690" count="100" /> <!-- Special HP Recovery Potion -->
</items>
</reward>
<reward id="3017" reward_id="3017" name="3 vs 3 Olympiad Winner V" requiredCompletion="5">
<!-- One-time mission. A reward is given for winning 5 of 3 vs 3 Olympiad matches. Not available on Sundays. -->
<handler name="olympiad" />
<items>
<item id="93290" count="1" /> <!-- Victory Pack -->
</items>
</reward>
<reward id="3018" reward_id="3018" name="Olympiad Competitor" requiredCompletion="50">
<!-- A reward is given when player will participating in 50 Olympiad matches in a month. Available from monday to friday. -->
<handler name="olympiad" />
<items>
<item id="97224" count="150" /> <!-- Mission Points -->
<item id="95687" count="1" /> <!-- Olympiad Treasure Chest Sealed -->
</items>
</reward>
<reward id="1017" reward_id="117" name="In-game Weekend" requiredCompletion="1">
<!-- Weekly mission. A reward is given for playing the game on Saturday or Sunday. -->
<handler name="loginweekend" />
<items>
<item id="94269" count="1" /> <!-- -->
<item id="3031" count="50" /> <!-- -->
</items>
</reward>
<reward id="1023" reward_id="501" name="Joining a Clan" requiredCompletion="1">
<!-- One-time mission. A reward is given when joining a clan for the first time. -->
<handler name="joinclan">
<param name="minLevel">40</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="90907" count="10" /> Soulshot Ticket
<item id="3031" count="50" /> Spirit Ore
<item id="93274" count="3" /> Sayha's Cookie
<item id="90768" count="1" /> <!-- Hair Accessory Coupon -->
</items>
</reward>
<reward id="3019" reward_id="3011" name="Difficult Assault on the Orc Fortress" requiredCompletion="1">
A reward is given for killing titled monsters during the battle for the Orc Fortress.
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="93068" count="1" /> Red Lantern
<item id="49674" count="3" /> XP Growth Scroll
</items>
</reward>
<reward id="3020" reward_id="3012" name="Assault on Orc Fortress" requiredCompletion="50">
A reward is given for killing titleless monsters during the battle for the Orc Fortress.
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="93070" count="5" /> Blue Lantern
<item id="49674" count="2" /> XP Growth Scroll
</items>
</reward>
<reward id="3013" reward_id="3013" name="3 vs 3 Olympiad Winner I" requiredCompletion="1">
One-time mission. A reward is given for winning a 3 vs 3 Olympiad match. Not available on Sundays.
<handler name="olympiad" />
<items>
<item id="92991" count="3" /> Einhasad's Blessing Scroll
</items>
</reward>
<reward id="3014" reward_id="3014" name="3 vs 3 Olympiad Winner II" requiredCompletion="2">
One-time mission. A reward is given for winning 2 of 3 vs 3 Olympiad matches. Not available on Sundays.
<handler name="olympiad" />
<items>
<item id="91690" count="50" /> Special HP Recovery Potion
</items>
</reward>
<reward id="3015" reward_id="3015" name="3 vs 3 Olympiad Winner III" requiredCompletion="3">
One-time mission. A reward is given for winning 3 of 3 vs 3 Olympiad matches. Not available on Sundays.
<handler name="olympiad" />
<items>
<item id="92991" count="5" /> Einhasad's Blessing Scroll
</items>
</reward>
<reward id="3016" reward_id="3016" name="3 vs 3 Olympiad Winner IV" requiredCompletion="4">
One-time mission. A reward is given for winning 4 of 3 vs 3 Olympiad matches. Not available on Sundays.
<handler name="olympiad" />
<items>
<item id="91690" count="100" /> Special HP Recovery Potion
</items>
</reward>
<reward id="3017" reward_id="3017" name="3 vs 3 Olympiad Winner V" requiredCompletion="5">
One-time mission. A reward is given for winning 5 of 3 vs 3 Olympiad matches. Not available on Sundays.
<handler name="olympiad" />
<items>
<item id="93290" count="1" /> Victory Pack
</items>
</reward>
<reward id="3018" reward_id="3018" name="Olympiad Percipient" requiredCompletion="50">
A reward is given when player will percipient in Olympiad, 50 times. Available from monday to friday.
<handler name="olympiad" />
<items>
<item id="97224" count="150" /> Mission Points
<item id="95687" count="1" /> Olympiad Treasure Chest Sealed
</items>
</reward>
-->
<reward id="9001" reward_id="9001" name="Clan Raid Attack" requiredCompletion="1">
<!-- Weekly mission. A reward is given for defeating 1 enemy together with your clan members in the Clan Arena. -->
<handler name="monster">
@ -1105,74 +914,313 @@
<item id="91830" count="5" /> <!-- Improved Fire Attack Potion -->
</items>
</reward>
<!-- TODO: FIND ID
<reward id="9004" reward_id="9004" name="Battle with Frintezza" requiredCompletion="1">
Weekly mission. A reward is given for defeating Scarlet van Halisha during a command channel raid to Frintezza.
<!-- Weekly mission. A reward is given for defeating Scarlet van Halisha during a command channel raid to Frintezza. -->
<handler name="monster">
<param name="ids">22271,22272,22273</param>
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="90907" count="20" /> Soulshot Ticket Sealed
<item id="3031" count="200" /> Spirit Ore Sealed
<item id="94481" count="200" /> Clan XP Sealed
<item id="94879" count="300" /> Grace Potion Sealed
<item id="97145" count="20" /> Ancient Adena
<item id="97224" count="10" /> Mission Points
<item id="90907" count="20" /> <!-- Soulshot Ticket Sealed -->
<item id="3031" count="200" /> <!-- Spirit Ore Sealed -->
<item id="94481" count="200" /> <!-- Clan XP Sealed -->
<item id="94879" count="300" /> <!-- Grace Potion Sealed -->
<item id="97145" count="20" /> <!-- Ancient Adena -->
<item id="97224" count="10" /> <!-- Mission Points -->
</items>
</reward>
<reward id="5036" reward_id="5036" name="Assault on Elmoreden Tower" requiredCompletion="50">
Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 60-74.
<handler name="monster">
<param name="ids">22271,22272,22273</param>
<param name="minLevel">60</param>
<param name="maxLevel">74</param>
<reward id="1112" reward_id="508" name="Fire Spirit Lv. 3" requiredCompletion="3">
<!-- One-time mission. A reward is given when evolving the Fire Spirit up to Lv. 3. -->
<handler name="spiritevolve">
<param name="element">FIRE</param>
</handler>
<items>
<item id="91671" count="1" /> Green Lantern (Time-limited) Sealed
<item id="97247" count="1" /> Asofe Sealed
<item id="97224" count="20" /> Mission Points
<item id="91185" count="30" /> <!-- Mid-grade Spirit's Blessing -->
</items>
</reward>
<reward id="5037" reward_id="5037" name="Assault on Elmoreden Tower" requiredCompletion="50">
Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 75-79.
<handler name="monster">
<param name="ids">22271,22272,22273</param>
<param name="minLevel">75</param>
<param name="maxLevel">79</param>
<reward id="1113" reward_id="509" name="Water Spirit Lv. 3" requiredCompletion="3">
<!-- One-time mission. A reward is given when evolving the Water Spirit up to Lv. 3. -->
<handler name="spiritevolve">
<param name="element">WATER</param>
</handler>
<items>
<item id="91671" count="1" /> Green Lantern (Time-limited) Sealed
<item id="97247" count="3" /> Asofe Sealed
<item id="97224" count="20" /> Mission Points
<item id="91185" count="30" /> <!-- Mid-grade Spirit's Blessing -->
</items>
</reward>
<reward id="5038" reward_id="5038" name="Assault on Elmoreden Tower" requiredCompletion="50">
Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 80-84.
<handler name="monster">
<param name="ids">22271,22272,22273</param>
<param name="minLevel">80</param>
<param name="maxLevel">84</param>
<reward id="1114" reward_id="510" name="Wind Spirit Lv. 3" requiredCompletion="3">
<!-- One-time mission. A reward is given when evolving the Wind Spirit up to Lv. 3. -->
<handler name="spiritevolve">
<param name="element">WIND</param>
</handler>
<items>
<item id="91671" count="1" /> Green Lantern (Time-limited) Sealed
<item id="97247" count="5" /> Asofe Sealed
<item id="97224" count="20" /> Mission Points
<item id="91185" count="30" /> <!-- Mid-grade Spirit's Blessing -->
</items>
</reward>
<reward id="5038" reward_id="5038" name="Assault on Elmoreden Tower" requiredCompletion="50">
Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 85+.
<reward id="1115" reward_id="511" name="Earth Spirit Lv. 3" requiredCompletion="3">
<!-- One-time mission. A reward is given when evolving the Earth Spirit up to Lv. 3. -->
<handler name="spiritevolve">
<param name="element">EARTH</param>
</handler>
<items>
<item id="91185" count="30" /> <!-- Mid-grade Spirit's Blessing -->
</items>
</reward>
<reward id="1162" reward_id="2031" name="Fire Spirit Lv. 5" requiredCompletion="5">
<!-- One-time quest. A reward is given when evolving the Fire Spirit up to Lv. 5. -->
<handler name="spiritevolve">
<param name="element">FIRE</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1163" reward_id="2032" name="Water Spirit Lv. 5" requiredCompletion="5">
<!-- One-time quest. A reward is given when evolving the Water Spirit up to Lv. 5. -->
<handler name="spiritevolve">
<param name="element">WATER</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1164" reward_id="2033" name="Wind Spirit Lv. 5" requiredCompletion="5">
<!-- One-time quest. A reward is given when evolving the Wind Spirit up to Lv. 5. -->
<handler name="spiritevolve">
<param name="element">WIND</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1165" reward_id="2034" name="Earth Spirit Lv. 5" requiredCompletion="5">
<!-- One-time quest. A reward is given when evolving the Earth Spirit up to Lv. 5. -->
<handler name="spiritevolve">
<param name="element">EARTH</param>
</handler>
<items>
<item id="91186" count="30" />
</items>
</reward>
<reward id="1116" reward_id="118" name="Attribute monsters hunting" requiredCompletion="1800">
<!-- A reward is given once a week for elemental monster hunting. -->
<handler name="monster">
<param name="ids">22271,22272,22273</param>
<param name="minLevel">85</param>
<param name="ids">20792,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20849,20995,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21678,21685,21686,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832</param>
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
</handler>
<items>
<item id="91671" count="1" /> Green Lantern (Time-limited) Sealed
<item id="97247" count="7" /> Asofe Sealed
<item id="97224" count="20" /> Mission Points
<item id="91030" count="10" /> <!-- Blessed Soul -->
<item id="97224" count="10" /> <!-- Mission Points -->
</items>
</reward>
<reward id="1503" reward_id="1503" name="Explore Primeval Isle" requiredCompletion="200">
<!-- A reward is given for killing 200 monsters on the Primeval Isle. -->
<handler name="monster">
<param name="minLevel">79</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="94879" count="50" /> <!-- Grace PotionSealed -->
<item id="97224" count="20" /> <!-- Mission Points -->
</items>
</reward>
<reward id="5036" reward_id="5036" name="Assault on Elmoreden Tower" requiredCompletion="50">
<!-- Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 60-74. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">74</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="91671" count="1" /> <!-- -->
<item id="97247" count="1" /> <!-- -->
<item id="97224" count="20" /> <!-- -->
</items>
</reward>
<reward id="5037" reward_id="5037" name="Assault on Elmoreden Tower" requiredCompletion="50">
<!-- Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 75-79. -->
<handler name="monster">
<param name="minLevel">75</param>
<param name="maxLevel">79</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="91670" count="1" /> <!-- -->
<item id="97247" count="3" /> <!-- -->
<item id="97224" count="20" /> <!-- -->
</items>
</reward>
<reward id="5038" reward_id="5038" name="Assault on Elmoreden Tower" requiredCompletion="50">
<!-- Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 80-84. -->
<handler name="monster">
<param name="minLevel">80</param>
<param name="maxLevel">84</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="91669" count="2" /> <!-- -->
<item id="97247" count="5" /> <!-- -->
<item id="97224" count="20" /> <!-- -->
</items>
</reward>
<reward id="5039" reward_id="5039" name="Assault on Elmoreden Tower" requiredCompletion="50">
<!-- Daily mission. A reward is given for killing 50 monsters in the Elmoreden Tower. Required level: 85+. -->
<handler name="monster">
<param name="minLevel">85</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="91668" count="2" /> <!-- -->
<item id="97247" count="7" /> <!-- -->
<item id="97224" count="20" /> <!-- -->
</items>
</reward>
<reward id="1505" reward_id="1505" name="Monster Purge" requiredCompletion="1">
<!-- A reward is given after receiving the reward for using the Purge system in the corresponding hunting zones. -->
<handler name="purge" />
<items>
<item id="94879" count="1" /> <!-- Aden Purge Crystal Sealed -->
<item id="97224" count="20" /> <!-- Mission Points -->
</items>
</reward>
<reward id="1506" reward_id="1506" name="Forgotten Primeval Garden I" requiredCompletion="100">
<!-- A reward is given for killing 100 Swift Hunter monsters in Forgotten Primeval Garden. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="92459" count="1" /> <!-- -->
<item id="97246" count="5" /> <!-- -->
</items>
</reward>
<reward id="1507" reward_id="1507" name="Forgotten Primeval Garden II" requiredCompletion="300">
<!-- A reward is given for killing 300 Swift Hunter monsters in Forgotten Primeval Garden. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="92459" count="2" /> <!-- -->
</items>
</reward>
<reward id="1508" reward_id="1508" name="Forgotten Primeval Garden III" requiredCompletion="1000">
<!-- A reward is given for killing 1000 Swift Hunter monsters in Forgotten Primeval Garden. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96787" count="4" /> <!-- -->
<item id="97145" count="100" /> <!-- -->
</items>
</reward>
<reward id="1509" reward_id="1509" name="Exploring Dreamland" requiredCompletion="1">
<!-- A reward is given for killing one of the following monsters in the Dream Dungeon: Gustav, Gustav's Steward, Gabrielle, Gabrielle's Minion, Ventus, Rekario, Tiat, Baint. / Kill 1 raid boss in one of the four dungeons. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> <!-- Dream Orb Sealed -->
<item id="93068" count="1" /> <!-- Red Lantern - 1st Place Sealed -->
<item id="97224" count="5" /> <!-- Mission Points -->
<item id="97145" count="100" /> <!-- Ancient Adena -->
</items>
</reward>
<reward id="1510" reward_id="1510" name="Exploring Dreamland's Secret Places" requiredCompletion="1">
<!-- A reward is given for killing Feline King or Feline Queen in the Cat Guild's Lair of the Dream Dungeon. / Kill 1 raid boss in the Cat Guild's dungeon. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> <!-- Dream Orb Sealed -->
</items>
</reward>
<reward id="1511" reward_id="1511" name="Exploring Alligator Island" requiredCompletion="100">
<!-- A reward is given for killing 100 Evolved monsters on Alligator Island. / Kill 100 Evolved monsters. -->
<handler name="monster">
<param name="minLevel">70</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="96925" count="1" /> <!-- Dream Orb Sealed -->
</items>
</reward>
<reward id="1512" reward_id="1512" name="Incessant Training" requiredCompletion="1">
<!-- A reward is given for killing one of the following monsters in the Training Zone: Boojudu, Petron, Kerion, Furious Tukhak, Rilva, Ryun, Chel. -->
<handler name="monster">
<param name="minLevel">76</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="97145" count="50" /> <!-- -->
</items>
</reward>
<reward id="1513" reward_id="1513" name="Combat on Balok Battleground" requiredCompletion="10">
<!-- A reward is given for killing 10 monsters on the Balok Battleground. -->
<handler name="monster">
<param name="minLevel">60</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="97145" count="50" /> <!-- -->
</items>
</reward>
<reward id="1514" reward_id="1514" name="Explore Goddard" requiredCompletion="1000">
<!-- A reward is given for killing 1000 monsters in the Gorde Canyon, Morgos' Military Base, Xilenos Fortress, Hot Springs. -->
<handler name="monster">
<param name="minLevel">85</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="97145" count="100" /> <!-- -->
</items>
</reward>
<reward id="1515" reward_id="1515" name="Explore Antharas' Lair" requiredCompletion="300">
<!-- A reward is given for killing 300 monsters in Antharas' Lair. -->
<handler name="monster">
<param name="minLevel">85</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="97246" count="10" /> <!-- -->
</items>
</reward>
<reward id="1516" reward_id="1516" name="Explore Frost Lord's Castle" requiredCompletion="300">
<!-- A reward is given for killing 300 monsters in Frost Lord's Castle. -->
<handler name="monster">
<param name="minLevel">85</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="97246" count="10" /> <!-- -->
</items>
</reward>
<reward id="5033" reward_id="5033" name="Ephemeral Frozen Canyon" requiredCompletion="50">
<!-- Daily mission (once per account). A reward is given for killing 50 monsters in the Frozen Canyon during the event. -->
<handler name="monster">
<param name="minLevel">65</param>
<param name="maxLevel">99</param>
<param name="ids">22192,22193,22194,22195,22196,22197,22198,22199</param>
</handler>
<items>
<item id="95836" count="50" /> <!-- Dream Orb Sealed -->
</items>
</reward>
-->
</list>

View File

@ -28,9 +28,11 @@ import handlers.dailymissionhandlers.LoginMonthDailyMissionHandler;
import handlers.dailymissionhandlers.LoginWeekendDailyMissionHandler;
import handlers.dailymissionhandlers.MonsterDailyMissionHandler;
import handlers.dailymissionhandlers.OlympiadDailyMissionHandler;
import handlers.dailymissionhandlers.PurgeRewardDailyMissionHandler;
import handlers.dailymissionhandlers.QuestDailyMissionHandler;
import handlers.dailymissionhandlers.SiegeDailyMissionHandler;
import handlers.dailymissionhandlers.SpiritDailyMissionHandler;
import handlers.dailymissionhandlers.UseItemDailyMissionHandler;
/**
* @author UnAfraid
@ -52,6 +54,8 @@ public class DailyMissionMasterHandler
DailyMissionHandler.getInstance().registerHandler("fishing", FishingDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("spirit", SpiritDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("joinclan", JoinClanDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("purge", PurgeRewardDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("useitem", UseItemDailyMissionHandler::new);
LOGGER.info(DailyMissionMasterHandler.class.getSimpleName() + ": Loaded " + DailyMissionHandler.getInstance().size() + " handlers.");
}
}

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

@ -16,13 +16,15 @@
*/
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;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.CommandChannel;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
@ -44,7 +46,8 @@ public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
private final int _minLevel;
private final int _maxLevel;
private final Set<Integer> _ids = new HashSet<>();
private final ElementalType _element;
private final String _startHour;
private final String _endHour;
public MonsterDailyMissionHandler(DailyMissionDataHolder holder)
{
@ -52,7 +55,6 @@ public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
_amount = holder.getRequiredCompletions();
_minLevel = holder.getParams().getInt("minLevel", 0);
_maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
_element = holder.getParams().getEnum("element", ElementalType.class, ElementalType.NONE);
final String ids = holder.getParams().getString("ids", "");
if (!ids.isEmpty())
{
@ -65,6 +67,8 @@ public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
}
}
}
_startHour = holder.getParams().getString("startHour", "");
_endHour = holder.getParams().getString("endHour", "");
}
@Override
@ -113,28 +117,25 @@ public class MonsterDailyMissionHandler extends AbstractDailyMissionHandler
{
return;
}
if ((_element != ElementalType.NONE) && (monster.getElementalSpiritType() != _element))
if (checkTimeInterval() || ((_startHour == "") && (_endHour == "")))
{
return;
}
final Party party = player.getParty();
if (party != null)
{
final CommandChannel channel = party.getCommandChannel();
final List<Player> members = channel != null ? channel.getMembers() : party.getMembers();
for (Player member : members)
final Party party = player.getParty();
if (party != null)
{
if ((member.getLevel() >= (monsterLevel - 5)) && (member.calculateDistance3D(monster) <= Config.ALT_PARTY_RANGE))
final CommandChannel channel = party.getCommandChannel();
final List<Player> members = channel != null ? channel.getMembers() : party.getMembers();
for (Player member : members)
{
processPlayerProgress(member);
if ((member.getLevel() >= (monsterLevel - 5)) && (member.calculateDistance3D(monster) <= Config.ALT_PARTY_RANGE))
{
processPlayerProgress(member);
}
}
}
}
else
{
processPlayerProgress(player);
else
{
processPlayerProgress(player);
}
}
}
@ -150,4 +151,28 @@ 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;
}
}

View File

@ -0,0 +1,100 @@
/*
* 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.item.OnItemPurgeReward;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author CostyKiller
*/
public class PurgeRewardDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
private final int _minLevel;
private final int _maxLevel;
public PurgeRewardDailyMissionHandler(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_ITEM_PURGE_REWARD, (OnItemPurgeReward event) -> onItemPurgeReward(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 onItemPurgeReward(OnItemPurgeReward event)
{
final Player player = event.getPlayer();
if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
{
return;
}
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,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

@ -37,7 +37,11 @@ import org.l2jmobius.gameserver.model.Message;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemPurgeReward;
import org.l2jmobius.gameserver.model.holders.PurgePlayerHolder;
import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.itemcontainer.Mail;
import org.l2jmobius.gameserver.network.serverpackets.subjugation.ExSubjugationSidebar;
@ -138,6 +142,17 @@ public class PurgeRankingManager
attachment.addItem("Purge reward", reward, 5 - counter, null, null);
MailManager.getInstance().sendMessage(msg);
// Notify to scripts.
final Player player = World.getInstance().getPlayer(charId);
final Item item = attachment.getItemByItemId(reward);
if (player != null)
{
if (EventDispatcher.getInstance().hasListener(EventType.ON_ITEM_PURGE_REWARD))
{
EventDispatcher.getInstance().notifyEventAsync(new OnItemPurgeReward(player, item));
}
}
try (Connection con = DatabaseFactory.getConnection())
{
try (PreparedStatement st = con.prepareStatement(DELETE_SUBJUGATION))

View File

@ -126,6 +126,7 @@ import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceLeave;
import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceStatusChange;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemBypassEvent;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemCreate;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemPurgeReward;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemTalk;
import org.l2jmobius.gameserver.model.events.impl.item.OnItemUse;
import org.l2jmobius.gameserver.model.events.impl.olympiad.OnOlympiadMatchResult;
@ -185,6 +186,7 @@ public enum EventType
ON_ITEM_CREATE(OnItemCreate.class, void.class),
ON_ITEM_USE(OnItemUse.class, void.class),
ON_ITEM_TALK(OnItemTalk.class, void.class),
ON_ITEM_PURGE_REWARD(OnItemPurgeReward.class, void.class),
// NPC events
ON_NPC_CAN_BE_SEEN(OnNpcCanBeSeen.class, void.class, TerminateReturn.class),

View File

@ -0,0 +1,53 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.item;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.instance.Item;
/**
* @author CostyKiller
*/
public class OnItemPurgeReward implements IBaseEvent
{
private final Player _player;
private final Item _item;
public OnItemPurgeReward(Player player, Item item)
{
_player = player;
_item = item;
}
public Player getPlayer()
{
return _player;
}
public Item getItem()
{
return _item;
}
@Override
public EventType getType()
{
return EventType.ON_ITEM_PURGE_REWARD;
}
}