Multiple timed zones support, time is shared.
This commit is contained in:
parent
9b320e4cfe
commit
1de26d2fa6
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user