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

@ -14224,7 +14224,8 @@ public class PlayerInstance extends Playable
{
final int x = ((getX() - World.MAP_MIN_X) >> 15) + World.TILE_X_MIN;
final int y = ((getY() - World.MAP_MIN_Y) >> 15) + World.TILE_Y_MIN;
if ((x == 25) && (y == 23)) // Storm Isle.
if (((x == 25) && (y == 23)) // Storm Isle.
|| ((x == 20) && (y == 17))) // Primeval Isle.
{
return true;
}

View File

@ -29,10 +29,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;
}
@ -84,7 +86,9 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
return;
}
if (player.getLevel() < 100)
if (((_fieldId == 1) && (player.getLevel() < 100)) //
|| ((_fieldId == 6) && (player.getLevel() < 105)) //
)
{
player.sendMessage("Your level is too low.");
}
@ -93,7 +97,19 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
{
player.reduceAdena("TimedHuntingZone", 150000, player, true);
player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME, System.currentTimeMillis() + 18000000); // 300 minutes
player.teleToLocation(194291, 176604, -1888); // Storm Isle
switch (_fieldId)
{
case 1: // Storm Isle
{
player.teleToLocation(194291, 176604, -1888);
break;
}
case 6: // Primeval Isle
{
player.teleToLocation(9400, -21720, -3634);
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,38 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
{
OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
final List<TimeRestrictedFieldInfo> infos = new ArrayList<>();
packet.writeD(2); // zone count
addField(infos);
// Isle of Storms
packet.writeD(1); // required item count
packet.writeD(57); // item id
packet.writeQ(150000); // item count
packet.writeD(1); // reset cycle
packet.writeD(1); // field id
packet.writeD(100); // min level
packet.writeD(120); // 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
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);
}
// Primeval Isle
packet.writeD(1); // required item count
packet.writeD(57); // item id
packet.writeQ(150000); // item count
packet.writeD(1); // reset cycle
packet.writeD(6); // field id
packet.writeD(105); // min level
packet.writeD(120); // 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 = 1;
field.minLevel = 100;
field.maxLevel = 120;
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 = 150000;
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;
}
}

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