DailyMission packet updates.

Adapted from: L2jUnity free files.
This commit is contained in:
MobiusDev 2017-11-17 04:14:06 +00:00
parent 8a82470da0
commit aecd32e322
8 changed files with 105 additions and 48 deletions

View File

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

View File

@ -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>

View File

@ -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)

View File

@ -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));

View File

@ -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));
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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