DailyMission packet updates.
Adapted from: L2jUnity free files.
This commit is contained in:
parent
8a82470da0
commit
aecd32e322
@ -2604,8 +2604,7 @@
|
|||||||
<item id="46919" count="1" />
|
<item id="46919" count="1" />
|
||||||
</items>
|
</items>
|
||||||
</reward>
|
</reward>
|
||||||
<!-- Dual Class
|
<reward id="187" reward_id="493" name="Reach Level (Dual Lv. 84)" requiredCompletion="84" isMainClassOnly="false" isDualClassOnly="true" isDisplayedWhenNotAvailable="false">
|
||||||
<reward id="187" reward_id="493" name="Reach Level (Dual Lv. 84)" requiredCompletion="84">
|
|
||||||
<handler name="level">
|
<handler name="level">
|
||||||
<param name="level">84</param>
|
<param name="level">84</param>
|
||||||
</handler>
|
</handler>
|
||||||
@ -2613,57 +2612,56 @@
|
|||||||
<item id="35987" count="10" />
|
<item id="35987" count="10" />
|
||||||
</items>
|
</items>
|
||||||
</reward>
|
</reward>
|
||||||
-->
|
<!--
|
||||||
<reward id="224" reward_id="604" name="Login Once During the Weekend" requiredCompletion="1" isOneTime="false">
|
<reward id="224" reward_id="604" name="Login Once During the Weekend" requiredCompletion="1" isMainClassOnly="false" isOneTime="false">
|
||||||
<items>
|
<items>
|
||||||
<item id="27593" count="4" />
|
<item id="27593" count="4" />
|
||||||
<item id="27603" count="1" />
|
<item id="27603" count="1" />
|
||||||
</items>
|
</items>
|
||||||
</reward>
|
</reward>
|
||||||
<!-- has issues - 2/1
|
<reward id="225" reward_id="605" name="Login Once During the Month" requiredCompletion="1" isMainClassOnly="false" isOneTime="false">
|
||||||
<reward id="225" reward_id="605" name="Login Once During the Month" requiredCompletion="1" isOneTime="false">
|
|
||||||
<items>
|
<items>
|
||||||
<item id="27593" count="15" />
|
<item id="27593" count="15" />
|
||||||
<item id="27603" count="1" />
|
<item id="27603" count="1" />
|
||||||
</items>
|
</items>
|
||||||
</reward>
|
</reward>
|
||||||
-->
|
-->
|
||||||
<reward id="226" reward_id="606" name="Complete Quests" requiredCompletion="2" isOneTime="false">
|
<reward id="226" reward_id="606" name="Complete Quests" isMainClassOnly="false" requiredCompletion="2" isOneTime="false">
|
||||||
<handler name="quest" />
|
<handler name="quest" />
|
||||||
<items>
|
<items>
|
||||||
<item id="27593" count="1" />
|
<item id="27593" count="1" />
|
||||||
<item id="27603" count="1" />
|
<item id="27603" count="1" />
|
||||||
</items>
|
</items>
|
||||||
</reward>
|
</reward>
|
||||||
<reward id="227" reward_id="607" name="Participate in the Olympiad" requiredCompletion="2" isOneTime="false">
|
<reward id="227" reward_id="607" name="Participate in the Olympiad" isMainClassOnly="false" requiredCompletion="2" isOneTime="false">
|
||||||
<handler name="olympiad" />
|
<handler name="olympiad" />
|
||||||
<items>
|
<items>
|
||||||
<item id="27593" count="4" />
|
<item id="27593" count="4" />
|
||||||
<item id="27603" count="3" />
|
<item id="27603" count="3" />
|
||||||
</items>
|
</items>
|
||||||
</reward>
|
</reward>
|
||||||
<reward id="228" reward_id="608" name="Sieges" requiredCompletion="1" isOneTime="false">
|
<reward id="228" reward_id="608" name="Sieges" requiredCompletion="1" isMainClassOnly="false" isOneTime="false">
|
||||||
<handler name="siege" />
|
<handler name="siege" />
|
||||||
<items>
|
<items>
|
||||||
<item id="27593" count="50" />
|
<item id="27593" count="50" />
|
||||||
<item id="27603" count="15" />
|
<item id="27603" count="15" />
|
||||||
</items>
|
</items>
|
||||||
</reward>
|
</reward>
|
||||||
<reward id="229" reward_id="609" name="Ceremony of Chaos" requiredCompletion="2" isOneTime="false">
|
<reward id="229" reward_id="609" name="Ceremony of Chaos" isMainClassOnly="false" requiredCompletion="2" isOneTime="false">
|
||||||
<handler name="ceremonyofchaos" />
|
<handler name="ceremonyofchaos" />
|
||||||
<items>
|
<items>
|
||||||
<item id="27593" count="2" />
|
<item id="27593" count="2" />
|
||||||
<item id="27603" count="1" />
|
<item id="27603" count="1" />
|
||||||
</items>
|
</items>
|
||||||
</reward>
|
</reward>
|
||||||
<reward id="230" reward_id="610" name="Boss Master" requiredCompletion="2" isOneTime="false">
|
<reward id="230" reward_id="610" name="Boss Master" isMainClassOnly="false" requiredCompletion="2" isOneTime="false">
|
||||||
<handler name="boss" />
|
<handler name="boss" />
|
||||||
<items>
|
<items>
|
||||||
<item id="27593" count="1" />
|
<item id="27593" count="1" />
|
||||||
<item id="27603" count="1" />
|
<item id="27603" count="1" />
|
||||||
</items>
|
</items>
|
||||||
</reward>
|
</reward>
|
||||||
<reward id="231" reward_id="611" name="Catch Fish" requiredCompletion="3" isOneTime="false">
|
<reward id="231" reward_id="611" name="Catch Fish" isMainClassOnly="false" requiredCompletion="3" isOneTime="false">
|
||||||
<handler name="fishing" />
|
<handler name="fishing" />
|
||||||
<items>
|
<items>
|
||||||
<item id="27593" count="1" />
|
<item id="27593" count="1" />
|
||||||
|
@ -38,6 +38,9 @@
|
|||||||
<xs:attribute type="xs:string" name="name" />
|
<xs:attribute type="xs:string" name="name" />
|
||||||
<xs:attribute type="xs:short" name="requiredCompletion" />
|
<xs:attribute type="xs:short" name="requiredCompletion" />
|
||||||
<xs:attribute type="xs:boolean" name="isOneTime" />
|
<xs:attribute type="xs:boolean" name="isOneTime" />
|
||||||
|
<xs:attribute type="xs:boolean" name="isMainClassOnly" />
|
||||||
|
<xs:attribute type="xs:boolean" name="isDualClassOnly" />
|
||||||
|
<xs:attribute type="xs:boolean" name="isDisplayedWhenNotAvailable" />
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
<xs:complexType name="listType">
|
<xs:complexType name="listType">
|
||||||
<xs:sequence>
|
<xs:sequence>
|
||||||
|
@ -38,6 +38,9 @@ public class DailyMissionDataHolder
|
|||||||
private final int _requiredCompletions;
|
private final int _requiredCompletions;
|
||||||
private final StatsSet _params;
|
private final StatsSet _params;
|
||||||
private final boolean _isOneTime;
|
private final boolean _isOneTime;
|
||||||
|
private final boolean _isMainClassOnly;
|
||||||
|
private final boolean _isDualClassOnly;
|
||||||
|
private final boolean _isDisplayedWhenNotAvailable;
|
||||||
private final AbstractDailyMissionHandler _handler;
|
private final AbstractDailyMissionHandler _handler;
|
||||||
|
|
||||||
public DailyMissionDataHolder(StatsSet set)
|
public DailyMissionDataHolder(StatsSet set)
|
||||||
@ -51,6 +54,9 @@ public class DailyMissionDataHolder
|
|||||||
_classRestriction = set.getList("classRestriction", ClassId.class);
|
_classRestriction = set.getList("classRestriction", ClassId.class);
|
||||||
_params = set.getObject("params", StatsSet.class);
|
_params = set.getObject("params", StatsSet.class);
|
||||||
_isOneTime = set.getBoolean("isOneTime", true);
|
_isOneTime = set.getBoolean("isOneTime", true);
|
||||||
|
_isMainClassOnly = set.getBoolean("isMainClassOnly", true);
|
||||||
|
_isDualClassOnly = set.getBoolean("isDualClassOnly", false);
|
||||||
|
_isDisplayedWhenNotAvailable = set.getBoolean("isDisplayedWhenNotAvailable", true);
|
||||||
_handler = handler != null ? handler.apply(this) : null;
|
_handler = handler != null ? handler.apply(this) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,9 +95,49 @@ public class DailyMissionDataHolder
|
|||||||
return _isOneTime;
|
return _isOneTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isMainClassOnly()
|
||||||
|
{
|
||||||
|
return _isMainClassOnly;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDualClassOnly()
|
||||||
|
{
|
||||||
|
return _isDualClassOnly;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDisplayedWhenNotAvailable()
|
||||||
|
{
|
||||||
|
return _isDisplayedWhenNotAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isDisplayable(L2PcInstance player)
|
public boolean isDisplayable(L2PcInstance player)
|
||||||
{
|
{
|
||||||
return (!_isOneTime || getRecentlyCompleted(player) || (getStatus(player) != DailyMissionStatus.COMPLETED.getClientId())) && (_classRestriction.isEmpty() || _classRestriction.contains(player.getClassId()));
|
// Check if its main class only
|
||||||
|
if (isMainClassOnly() && (player.isSubClassActive() || player.isDualClassActive()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if its dual class only.
|
||||||
|
if (isDualClassOnly() && !player.isDualClassActive())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for specific class restrictions
|
||||||
|
if (!_classRestriction.isEmpty() && !_classRestriction.contains(player.getClassId()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int status = getStatus(player);
|
||||||
|
if (!isDisplayedWhenNotAvailable() && (status == DailyMissionStatus.NOT_AVAILABLE.getClientId()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show only if its repeatable, recently completed or incompleted that has met the checks above.
|
||||||
|
return (!isOneTime() || getRecentlyCompleted(player) || (status != DailyMissionStatus.COMPLETED.getClientId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void requestReward(L2PcInstance player)
|
public void requestReward(L2PcInstance player)
|
||||||
|
@ -641,8 +641,8 @@ public class EnterWorld implements IClientIncomingPacket
|
|||||||
{
|
{
|
||||||
activeChar.sendPacket(new ExWorldChatCnt(activeChar));
|
activeChar.sendPacket(new ExWorldChatCnt(activeChar));
|
||||||
}
|
}
|
||||||
|
activeChar.sendPacket(new ExConnectedTimeAndGettableReward(activeChar));
|
||||||
activeChar.sendPacket(new ExOneDayReceiveRewardList(activeChar, true));
|
activeChar.sendPacket(new ExOneDayReceiveRewardList(activeChar, true));
|
||||||
activeChar.sendPacket(ExConnectedTimeAndGettableReward.STATIC_PACKET);
|
|
||||||
|
|
||||||
// Handle soulshots, disable all on EnterWorld
|
// Handle soulshots, disable all on EnterWorld
|
||||||
activeChar.sendPacket(new ExAutoSoulShot(0, true, 0));
|
activeChar.sendPacket(new ExAutoSoulShot(0, true, 0));
|
||||||
|
@ -32,12 +32,12 @@ import com.l2jmobius.gameserver.network.serverpackets.dailymission.ExOneDayRecei
|
|||||||
*/
|
*/
|
||||||
public class RequestOneDayRewardReceive implements IClientIncomingPacket
|
public class RequestOneDayRewardReceive implements IClientIncomingPacket
|
||||||
{
|
{
|
||||||
private int _reward;
|
private int _id;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean read(L2GameClient client, PacketReader packet)
|
public boolean read(L2GameClient client, PacketReader packet)
|
||||||
{
|
{
|
||||||
_reward = packet.readH();
|
_id = packet.readH();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,14 +50,14 @@ public class RequestOneDayRewardReceive implements IClientIncomingPacket
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Collection<DailyMissionDataHolder> reward = DailyMissionData.getInstance().getDailyMissionData(_reward);
|
final Collection<DailyMissionDataHolder> reward = DailyMissionData.getInstance().getDailyMissionData(_id);
|
||||||
if ((reward == null) || reward.isEmpty())
|
if ((reward == null) || reward.isEmpty())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
reward.stream().filter(o -> o.isDisplayable(player)).forEach(r -> r.requestReward(player));
|
reward.stream().filter(o -> o.isDisplayable(player)).forEach(r -> r.requestReward(player));
|
||||||
player.sendPacket(new ExConnectedTimeAndGettableReward());
|
player.sendPacket(new ExConnectedTimeAndGettableReward(player));
|
||||||
player.sendPacket(new ExOneDayReceiveRewardList(player, true));
|
player.sendPacket(new ExOneDayReceiveRewardList(player, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ import com.l2jmobius.gameserver.network.serverpackets.dailymission.ExOneDayRecei
|
|||||||
public class RequestTodoList implements IClientIncomingPacket
|
public class RequestTodoList implements IClientIncomingPacket
|
||||||
{
|
{
|
||||||
private int _tab;
|
private int _tab;
|
||||||
|
@SuppressWarnings("unused")
|
||||||
private boolean _showAllLevels;
|
private boolean _showAllLevels;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -59,9 +60,10 @@ public class RequestTodoList implements IClientIncomingPacket
|
|||||||
// player.sendPacket(new ExTodoListInzone());
|
// player.sendPacket(new ExTodoListInzone());
|
||||||
// break;
|
// break;
|
||||||
// }
|
// }
|
||||||
case 9:
|
case 9: // Daily Rewards
|
||||||
{
|
{
|
||||||
player.sendPacket(new ExOneDayReceiveRewardList(player, _showAllLevels));
|
// Initial EW request should be false
|
||||||
|
player.sendPacket(new ExOneDayReceiveRewardList(player, true));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
package com.l2jmobius.gameserver.network.serverpackets;
|
package com.l2jmobius.gameserver.network.serverpackets;
|
||||||
|
|
||||||
import com.l2jmobius.commons.network.PacketWriter;
|
import com.l2jmobius.commons.network.PacketWriter;
|
||||||
|
import com.l2jmobius.gameserver.data.xml.impl.DailyMissionData;
|
||||||
|
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||||
import com.l2jmobius.gameserver.network.OutgoingPackets;
|
import com.l2jmobius.gameserver.network.OutgoingPackets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -24,16 +26,29 @@ import com.l2jmobius.gameserver.network.OutgoingPackets;
|
|||||||
*/
|
*/
|
||||||
public class ExConnectedTimeAndGettableReward implements IClientOutgoingPacket
|
public class ExConnectedTimeAndGettableReward implements IClientOutgoingPacket
|
||||||
{
|
{
|
||||||
public static final ExConnectedTimeAndGettableReward STATIC_PACKET = new ExConnectedTimeAndGettableReward();
|
private final int _oneDayRewardAvailableCount;
|
||||||
|
|
||||||
|
public ExConnectedTimeAndGettableReward(L2PcInstance player)
|
||||||
|
{
|
||||||
|
_oneDayRewardAvailableCount = DailyMissionData.getInstance().getDailyMissionData(player).size();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean write(PacketWriter packet)
|
public boolean write(PacketWriter packet)
|
||||||
{
|
{
|
||||||
OutgoingPackets.EX_CONNECTED_TIME_AND_GETTABLE_REWARD.writeId(packet);
|
OutgoingPackets.EX_CONNECTED_TIME_AND_GETTABLE_REWARD.writeId(packet);
|
||||||
for (int i = 0; i < 16; i++) // TODO : Find what the hell it is
|
packet.writeD(0x00);
|
||||||
{
|
packet.writeD(_oneDayRewardAvailableCount);
|
||||||
packet.writeD(0x00);
|
packet.writeD(0x00);
|
||||||
}
|
packet.writeD(0x00);
|
||||||
|
packet.writeD(0x00);
|
||||||
|
packet.writeD(0x00);
|
||||||
|
packet.writeD(0x00);
|
||||||
|
packet.writeD(0x00);
|
||||||
|
packet.writeD(0x00);
|
||||||
|
packet.writeD(0x00);
|
||||||
|
packet.writeD(0x00);
|
||||||
|
packet.writeD(0x00);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,9 @@
|
|||||||
package com.l2jmobius.gameserver.network.serverpackets.dailymission;
|
package com.l2jmobius.gameserver.network.serverpackets.dailymission;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.Calendar;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
import com.l2jmobius.commons.network.PacketWriter;
|
import com.l2jmobius.commons.network.PacketWriter;
|
||||||
import com.l2jmobius.gameserver.data.xml.impl.DailyMissionData;
|
import com.l2jmobius.gameserver.data.xml.impl.DailyMissionData;
|
||||||
@ -26,6 +27,7 @@ import com.l2jmobius.gameserver.model.DailyMissionDataHolder;
|
|||||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||||
import com.l2jmobius.gameserver.network.OutgoingPackets;
|
import com.l2jmobius.gameserver.network.OutgoingPackets;
|
||||||
import com.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
|
import com.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
|
||||||
|
import com.l2jmobius.gameserver.util.cron4j.Predictor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Sdw
|
* @author Sdw
|
||||||
@ -34,11 +36,19 @@ public class ExOneDayReceiveRewardList implements IClientOutgoingPacket
|
|||||||
{
|
{
|
||||||
final L2PcInstance _player;
|
final L2PcInstance _player;
|
||||||
private final Collection<DailyMissionDataHolder> _rewards;
|
private final Collection<DailyMissionDataHolder> _rewards;
|
||||||
|
private final static Function<String, Long> _remainTime = pattern -> (new Predictor(pattern).nextMatchingTime() - System.currentTimeMillis()) / 1000L;
|
||||||
|
|
||||||
public ExOneDayReceiveRewardList(L2PcInstance player, boolean showAllLevels)
|
private final long _dayRemainTime;
|
||||||
|
private final long _weekRemainTime;
|
||||||
|
private final long _monthRemainTime;
|
||||||
|
|
||||||
|
public ExOneDayReceiveRewardList(L2PcInstance player, boolean sendRewards)
|
||||||
{
|
{
|
||||||
_player = player;
|
_player = player;
|
||||||
_rewards = DailyMissionData.getInstance().getDailyMissionData(player);
|
_rewards = sendRewards ? DailyMissionData.getInstance().getDailyMissionData(player) : Collections.emptyList();
|
||||||
|
_dayRemainTime = _remainTime.apply("30 6 * * *");
|
||||||
|
_weekRemainTime = _remainTime.apply("30 6 * * 1");
|
||||||
|
_monthRemainTime = _remainTime.apply("30 6 1 * *");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -46,26 +56,9 @@ public class ExOneDayReceiveRewardList implements IClientOutgoingPacket
|
|||||||
{
|
{
|
||||||
OutgoingPackets.EX_ONE_DAY_RECEIVE_REWARD_LIST.writeId(packet);
|
OutgoingPackets.EX_ONE_DAY_RECEIVE_REWARD_LIST.writeId(packet);
|
||||||
|
|
||||||
Calendar calendar = Calendar.getInstance();
|
packet.writeD((int) _dayRemainTime);
|
||||||
long currentTimeMillis = calendar.getTimeInMillis();
|
packet.writeD((int) _weekRemainTime);
|
||||||
int timeRemaining = 0;
|
packet.writeD((int) _monthRemainTime);
|
||||||
|
|
||||||
calendar.add(Calendar.HOUR, 24);
|
|
||||||
calendar.set(Calendar.HOUR, 6);
|
|
||||||
calendar.set(Calendar.MINUTE, 30);
|
|
||||||
timeRemaining = (int) (((calendar.getTimeInMillis() - currentTimeMillis) / 1000) / 60); // minutes
|
|
||||||
packet.writeD(timeRemaining); // Until 06:30 UTC
|
|
||||||
|
|
||||||
calendar.add(Calendar.WEEK_OF_MONTH, 1);
|
|
||||||
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
|
|
||||||
timeRemaining = (int) (((calendar.getTimeInMillis() - currentTimeMillis) / 1000) / 60); // minutes
|
|
||||||
packet.writeD(timeRemaining); // Until Monday 06:30 UTC
|
|
||||||
|
|
||||||
calendar.add(Calendar.MONTH, 1);
|
|
||||||
calendar.set(Calendar.DAY_OF_MONTH, 1);
|
|
||||||
timeRemaining = (int) (((calendar.getTimeInMillis() - currentTimeMillis) / 1000) / 60); // minutes
|
|
||||||
packet.writeD(timeRemaining); // Until 1st of month 06:30 UTC
|
|
||||||
|
|
||||||
packet.writeC(0x17);
|
packet.writeC(0x17);
|
||||||
packet.writeD(_player.getClassId().getId());
|
packet.writeD(_player.getClassId().getId());
|
||||||
packet.writeD(LocalDate.now().getDayOfWeek().ordinal()); // Day of week
|
packet.writeD(LocalDate.now().getDayOfWeek().ordinal()); // Day of week
|
||||||
|
Loading…
Reference in New Issue
Block a user