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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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