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" />
|
||||
</items>
|
||||
</reward>
|
||||
<!-- Dual Class
|
||||
<reward id="187" reward_id="493" name="Reach Level (Dual Lv. 84)" requiredCompletion="84">
|
||||
<reward id="187" reward_id="493" name="Reach Level (Dual Lv. 84)" requiredCompletion="84" isMainClassOnly="false" isDualClassOnly="true" isDisplayedWhenNotAvailable="false">
|
||||
<handler name="level">
|
||||
<param name="level">84</param>
|
||||
</handler>
|
||||
@ -2613,57 +2612,56 @@
|
||||
<item id="35987" count="10" />
|
||||
</items>
|
||||
</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>
|
||||
<item id="27593" count="4" />
|
||||
<item id="27603" count="1" />
|
||||
</items>
|
||||
</reward>
|
||||
<!-- has issues - 2/1
|
||||
<reward id="225" reward_id="605" name="Login Once During the Month" requiredCompletion="1" isOneTime="false">
|
||||
<reward id="225" reward_id="605" name="Login Once During the Month" requiredCompletion="1" isMainClassOnly="false" isOneTime="false">
|
||||
<items>
|
||||
<item id="27593" count="15" />
|
||||
<item id="27603" count="1" />
|
||||
</items>
|
||||
</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" />
|
||||
<items>
|
||||
<item id="27593" count="1" />
|
||||
<item id="27603" count="1" />
|
||||
</items>
|
||||
</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" />
|
||||
<items>
|
||||
<item id="27593" count="4" />
|
||||
<item id="27603" count="3" />
|
||||
</items>
|
||||
</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" />
|
||||
<items>
|
||||
<item id="27593" count="50" />
|
||||
<item id="27603" count="15" />
|
||||
</items>
|
||||
</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" />
|
||||
<items>
|
||||
<item id="27593" count="2" />
|
||||
<item id="27603" count="1" />
|
||||
</items>
|
||||
</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" />
|
||||
<items>
|
||||
<item id="27593" count="1" />
|
||||
<item id="27603" count="1" />
|
||||
</items>
|
||||
</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" />
|
||||
<items>
|
||||
<item id="27593" count="1" />
|
||||
|
@ -38,6 +38,9 @@
|
||||
<xs:attribute type="xs:string" name="name" />
|
||||
<xs:attribute type="xs:short" name="requiredCompletion" />
|
||||
<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 name="listType">
|
||||
<xs:sequence>
|
||||
|
@ -38,6 +38,9 @@ public class DailyMissionDataHolder
|
||||
private final int _requiredCompletions;
|
||||
private final StatsSet _params;
|
||||
private final boolean _isOneTime;
|
||||
private final boolean _isMainClassOnly;
|
||||
private final boolean _isDualClassOnly;
|
||||
private final boolean _isDisplayedWhenNotAvailable;
|
||||
private final AbstractDailyMissionHandler _handler;
|
||||
|
||||
public DailyMissionDataHolder(StatsSet set)
|
||||
@ -51,6 +54,9 @@ public class DailyMissionDataHolder
|
||||
_classRestriction = set.getList("classRestriction", ClassId.class);
|
||||
_params = set.getObject("params", StatsSet.class);
|
||||
_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;
|
||||
}
|
||||
|
||||
@ -89,9 +95,49 @@ public class DailyMissionDataHolder
|
||||
return _isOneTime;
|
||||
}
|
||||
|
||||
public boolean isMainClassOnly()
|
||||
{
|
||||
return _isMainClassOnly;
|
||||
}
|
||||
|
||||
public boolean isDualClassOnly()
|
||||
{
|
||||
return _isDualClassOnly;
|
||||
}
|
||||
|
||||
public boolean isDisplayedWhenNotAvailable()
|
||||
{
|
||||
return _isDisplayedWhenNotAvailable;
|
||||
}
|
||||
|
||||
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)
|
||||
|
@ -641,8 +641,8 @@ public class EnterWorld implements IClientIncomingPacket
|
||||
{
|
||||
activeChar.sendPacket(new ExWorldChatCnt(activeChar));
|
||||
}
|
||||
activeChar.sendPacket(new ExConnectedTimeAndGettableReward(activeChar));
|
||||
activeChar.sendPacket(new ExOneDayReceiveRewardList(activeChar, true));
|
||||
activeChar.sendPacket(ExConnectedTimeAndGettableReward.STATIC_PACKET);
|
||||
|
||||
// Handle soulshots, disable all on EnterWorld
|
||||
activeChar.sendPacket(new ExAutoSoulShot(0, true, 0));
|
||||
|
@ -32,12 +32,12 @@ import com.l2jmobius.gameserver.network.serverpackets.dailymission.ExOneDayRecei
|
||||
*/
|
||||
public class RequestOneDayRewardReceive implements IClientIncomingPacket
|
||||
{
|
||||
private int _reward;
|
||||
private int _id;
|
||||
|
||||
@Override
|
||||
public boolean read(L2GameClient client, PacketReader packet)
|
||||
{
|
||||
_reward = packet.readH();
|
||||
_id = packet.readH();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -50,14 +50,14 @@ public class RequestOneDayRewardReceive implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
final Collection<DailyMissionDataHolder> reward = DailyMissionData.getInstance().getDailyMissionData(_reward);
|
||||
final Collection<DailyMissionDataHolder> reward = DailyMissionData.getInstance().getDailyMissionData(_id);
|
||||
if ((reward == null) || reward.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,7 @@ import com.l2jmobius.gameserver.network.serverpackets.dailymission.ExOneDayRecei
|
||||
public class RequestTodoList implements IClientIncomingPacket
|
||||
{
|
||||
private int _tab;
|
||||
@SuppressWarnings("unused")
|
||||
private boolean _showAllLevels;
|
||||
|
||||
@Override
|
||||
@ -59,9 +60,10 @@ public class RequestTodoList implements IClientIncomingPacket
|
||||
// player.sendPacket(new ExTodoListInzone());
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
|
@ -17,6 +17,8 @@
|
||||
package com.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
@ -24,16 +26,29 @@ import com.l2jmobius.gameserver.network.OutgoingPackets;
|
||||
*/
|
||||
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
|
||||
public boolean write(PacketWriter 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(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);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -17,8 +17,9 @@
|
||||
package com.l2jmobius.gameserver.network.serverpackets.dailymission;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Calendar;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.function.Function;
|
||||
|
||||
import com.l2jmobius.commons.network.PacketWriter;
|
||||
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.network.OutgoingPackets;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
|
||||
import com.l2jmobius.gameserver.util.cron4j.Predictor;
|
||||
|
||||
/**
|
||||
* @author Sdw
|
||||
@ -34,11 +36,19 @@ public class ExOneDayReceiveRewardList implements IClientOutgoingPacket
|
||||
{
|
||||
final L2PcInstance _player;
|
||||
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;
|
||||
_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
|
||||
@ -46,26 +56,9 @@ public class ExOneDayReceiveRewardList implements IClientOutgoingPacket
|
||||
{
|
||||
OutgoingPackets.EX_ONE_DAY_RECEIVE_REWARD_LIST.writeId(packet);
|
||||
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
long currentTimeMillis = calendar.getTimeInMillis();
|
||||
int timeRemaining = 0;
|
||||
|
||||
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.writeD((int) _dayRemainTime);
|
||||
packet.writeD((int) _weekRemainTime);
|
||||
packet.writeD((int) _monthRemainTime);
|
||||
packet.writeC(0x17);
|
||||
packet.writeD(_player.getClassId().getId());
|
||||
packet.writeD(LocalDate.now().getDayOfWeek().ordinal()); // Day of week
|
||||
|
Loading…
Reference in New Issue
Block a user