Multiple timed zones support, time is shared.

This commit is contained in:
MobiusDevelopment
2020-01-23 00:47:45 +00:00
parent 9b320e4cfe
commit 1de26d2fa6
7 changed files with 101 additions and 156 deletions

View File

@@ -28,10 +28,12 @@ import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
*/
public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
{
private int _fieldId;
@Override
public boolean read(GameClient client, PacketReader packet)
{
packet.readD(); // Zone id.
_fieldId = packet.readD();
return true;
}
@@ -83,7 +85,7 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
return;
}
if (player.getLevel() < 78)
if ((_fieldId == 2) && (player.getLevel() < 78))
{
player.sendMessage("Your level is too low.");
}
@@ -92,7 +94,14 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
{
player.reduceAdena("TimedHuntingZone", 10000, player, true);
player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME, System.currentTimeMillis() + 18000000); // 300 minutes
player.teleToLocation(13181, -78651, -5977); // Ancient Pirates' Tomb
switch (_fieldId)
{
case 2: // Ancient Pirates' Tomb
{
player.teleToLocation(13181, -78651, -5977);
break;
}
}
player.startTimedHuntingZone(18000000); // 300 minutes
}
else

View File

@@ -22,6 +22,9 @@ import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneList;
/**
* @author Mobius
*/
public class ExTimedHuntingZoneList implements IClientIncomingPacket
{
@Override
@@ -39,6 +42,6 @@ public class ExTimedHuntingZoneList implements IClientIncomingPacket
return;
}
client.sendPacket(new TimedHuntingZoneList());
client.sendPacket(new TimedHuntingZoneList(player));
}
}

View File

@@ -16,17 +16,21 @@
*/
package org.l2jmobius.gameserver.network.serverpackets.sessionzones;
import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author Mobius
*/
public class TimedHuntingZoneList implements IClientOutgoingPacket
{
public TimedHuntingZoneList()
private final PlayerInstance _player;
public TimedHuntingZoneList(PlayerInstance player)
{
_player = player;
}
@Override
@@ -34,78 +38,23 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
{
OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
final List<TimeRestrictedFieldInfo> infos = new ArrayList<>();
packet.writeD(1); // zone count
addField(infos);
packet.writeD(infos.size());
for (TimeRestrictedFieldInfo info : infos)
{
packet.writeD(info.requiredItems.size());
for (FieldRequiredItem item : info.requiredItems)
{
packet.writeD(item.itemId);
packet.writeQ(item.count);
}
packet.writeD(info.resetCycle);
packet.writeD(info.fieldId);
packet.writeD(info.minLevel);
packet.writeD(info.maxLevel);
packet.writeD(info.remainTimeBase);
packet.writeD(info.remainTime);
packet.writeD(info.remainTimeMax);
packet.writeD(info.remainRefillTime);
packet.writeD(info.refillTimeMax);
packet.writeC(info.fieldActivated ? 1 : 0);
}
// Ancient Pirates' Tomb
packet.writeD(1); // required item count
packet.writeD(57); // item id
packet.writeQ(10000); // item count
packet.writeD(1); // reset cycle
packet.writeD(2); // field id
packet.writeD(78); // min level
packet.writeD(999); // max level
packet.writeD(3600); // remain time base
packet.writeD(3600); // remain time
packet.writeD(21600); // remain time max
packet.writeD(18000); // remain refill time
packet.writeD(18000); // refill time max
packet.writeC(_player.isInTimedHuntingZone() ? 0 : 1); // field activated
return true;
}
private void addField(List<TimeRestrictedFieldInfo> infos)
{
final TimeRestrictedFieldInfo field = new TimeRestrictedFieldInfo();
field.resetCycle = 1;
field.fieldId = 2;
field.minLevel = 78;
field.maxLevel = 999;
field.remainTimeBase = 3600;
field.remainTime = 3600;
field.remainTimeMax = 21600;
field.remainRefillTime = 18000;
field.refillTimeMax = 18000;
field.fieldActivated = true;
final FieldRequiredItem item = new FieldRequiredItem();
item.itemId = 57;
item.count = 10000;
field.requiredItems = List.of(item);
infos.add(field);
}
static class TimeRestrictedFieldInfo
{
List<FieldRequiredItem> requiredItems;
int resetCycle;
int fieldId;
int minLevel;
int maxLevel;
int remainTimeBase;
int remainTime;
int remainTimeMax;
int remainRefillTime;
int refillTimeMax;
boolean fieldActivated;
}
static class FieldRequiredItem
{
int itemId;
long count;
}
}