Merged zone vertices with XML and categorized by type.

Most data come from aCis free version.
This commit is contained in:
MobiusDevelopment
2020-02-01 22:24:25 +00:00
parent c2bf138434
commit 4b5a762ff4
79 changed files with 10945 additions and 17026 deletions

View File

@@ -17,7 +17,6 @@
package org.l2jmobius.gameserver.datatables.xml;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
@@ -26,12 +25,11 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.ArenaManager;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.ClanHallManager;
import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.TownManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature;
@@ -55,29 +53,6 @@ public class MapRegionData implements IXmlReader
public static final Location FLORAN_VILLAGE_LOCATION = new Location(17817, 170079, -3530);
public static final Location JAIL_LOCATION = new Location(-114356, -249645, -2984);
private static final Location EXIT_MONSTER_RACE_LOCATION = new Location(12661, 181687, -3560);
private static final List<Location> KARMA_LOCATIONS = new ArrayList<>();
static
{
KARMA_LOCATIONS.add(new Location(-79077, 240355, -3440)); // Talking Island Village
KARMA_LOCATIONS.add(new Location(43503, 40398, -3450)); // Elven Village
KARMA_LOCATIONS.add(new Location(1675, 19581, -3110)); // Dark Elven Village
KARMA_LOCATIONS.add(new Location(-44413, -121762, -235)); // Orc Village
KARMA_LOCATIONS.add(new Location(12009, -187319, -3309)); // Dwarven Village
KARMA_LOCATIONS.add(new Location(-18872, 126216, -3280)); // Town of Gludio
KARMA_LOCATIONS.add(new Location(-85915, 150402, -3060)); // Gludin Village
KARMA_LOCATIONS.add(new Location(23652, 144823, -3330)); // Town of Dion
KARMA_LOCATIONS.add(new Location(79125, 154197, -3490)); // Town of Giran
KARMA_LOCATIONS.add(new Location(73840, 58193, -2730)); // Town of Oren
KARMA_LOCATIONS.add(new Location(44413, 22610, 235)); // Town of Aden
KARMA_LOCATIONS.add(new Location(114137, 72993, -2445)); // Hunters Village
KARMA_LOCATIONS.add(new Location(79125, 154197, -3490)); // Giran Harbor
KARMA_LOCATIONS.add(new Location(119536, 218558, -3495)); // Heine
KARMA_LOCATIONS.add(new Location(42931, -44733, -1326)); // Rune Township
KARMA_LOCATIONS.add(new Location(147419, -64980, -3457)); // Town of Goddard
KARMA_LOCATIONS.add(new Location(85184, -138560, -2256)); // Town of Shuttgart
KARMA_LOCATIONS.add(new Location(17817, 170079, -3530)); // Floran Village
KARMA_LOCATIONS.add(new Location(9927, -24138, -3723)); // Primeval Isle Wharf
}
private static final int[][] REGIONS = new int[19][21];
protected MapRegionData()
@@ -148,11 +123,129 @@ public class MapRegionData implements IXmlReader
return (posY >> 15) + 10;
}
public Location getTeleToLocation(Creature creature, TeleportWhereType teleportWhere)
{
// The character isn't a player, bypass all checks and retrieve a random spawn location on closest town.
if (!(creature instanceof PlayerInstance))
{
return getClosestTown(creature.getX(), creature.getY()).getSpawnLoc();
}
final PlayerInstance player = creature.getActingPlayer();
// If in Monster Derby Track
if (player.isInsideZone(ZoneId.MONSTER_TRACK))
{
return EXIT_MONSTER_RACE_LOCATION;
}
Castle castle = null;
Fort fort = null;
ClanHall clanhall = null;
if (player.getClan() != null)
{
// If teleport to clan hall
if (teleportWhere == TeleportWhereType.CLANHALL)
{
clanhall = ClanHallManager.getInstance().getClanHallByOwner(player.getClan());
if (clanhall != null)
{
final ClanHallZone zone = clanhall.getZone();
if (zone != null)
{
return zone.getSpawnLoc();
}
}
}
// If teleport to castle
if (teleportWhere == TeleportWhereType.CASTLE)
{
castle = CastleManager.getInstance().getCastleByOwner(player.getClan());
}
// If teleport to fort
if (teleportWhere == TeleportWhereType.FORTRESS)
{
fort = FortManager.getInstance().getFortByOwner(player.getClan());
}
// Check if player is on castle or fortress ground
if (castle == null)
{
castle = CastleManager.getInstance().getCastle(player);
}
if (fort == null)
{
fort = FortManager.getInstance().getFort(player);
}
if ((castle != null) && (castle.getCastleId() > 0))
{
// If Teleporting to castle or if is on caslte with siege and player's clan is defender
if ((teleportWhere == TeleportWhereType.CASTLE) || ((teleportWhere == TeleportWhereType.CASTLE) && castle.getSiege().isInProgress() && (castle.getSiege().getDefenderClan(player.getClan()) != null)))
{
return castle.getZone().getSpawnLoc();
}
if ((teleportWhere == TeleportWhereType.SIEGEFLAG) && castle.getSiege().isInProgress())
{
// Check if player's clan is attacker
final List<NpcInstance> flags = castle.getSiege().getFlag(player.getClan());
if ((flags != null) && !flags.isEmpty())
{
// Spawn to flag - Need more work to get player to the nearest flag
final NpcInstance flag = flags.get(0);
return new Location(flag.getX(), flag.getY(), flag.getZ());
}
}
}
else if ((fort != null) && (fort.getFortId() > 0))
{
// Teleporting to castle or fortress is on castle with siege and player's clan is defender
if ((teleportWhere == TeleportWhereType.FORTRESS) || ((teleportWhere == TeleportWhereType.FORTRESS) && fort.getSiege().isInProgress() && (fort.getSiege().getDefenderClan(player.getClan()) != null)))
{
return fort.getZone().getSpawnLoc();
}
if ((teleportWhere == TeleportWhereType.SIEGEFLAG) && fort.getSiege().isInProgress())
{
// Check if player's clan is attacker
final List<NpcInstance> flags = fort.getSiege().getFlag(player.getClan());
if ((flags != null) && !flags.isEmpty())
{
// Spawn to flag
final NpcInstance flag = flags.get(0);
return new Location(flag.getX(), flag.getY(), flag.getZ());
}
}
}
}
// Karma player lands out of city.
if (player.getKarma() > 0)
{
return getClosestTown(player).getChaoticSpawnLoc();
}
// Check if player is in arena.
final ArenaZone arena = ZoneData.getInstance().getZone(player, ArenaZone.class);
if (arena != null)
{
return arena.getSpawnLoc();
}
// Retrieve a random spawn location of the nearest town.
return getClosestTown(player).getSpawnLoc();
}
public int getAreaCastle(Creature creature)
{
switch (getClosestTownNumber(creature))
{
case 0:// Talking Island Village
case 0: // Talking Island Village
{
return 1;
}
@@ -323,137 +416,261 @@ public class MapRegionData implements IXmlReader
}
}
public Location getTeleToLocation(Creature creature, TeleportWhereType teleportWhere)
/**
* A specific method, used ONLY by players. There's a Race condition.
* @param player : The player used to find race, x and y.
* @return the closest TownZone based on a X/Y location.
*/
private TownZone getClosestTown(PlayerInstance player)
{
if (creature instanceof PlayerInstance)
switch (getMapRegion(player.getX(), player.getY()))
{
final PlayerInstance player = creature.getActingPlayer();
// If in Monster Derby Track
if (player.isInsideZone(ZoneId.MONSTER_TRACK))
case 0: // TI
{
return EXIT_MONSTER_RACE_LOCATION;
return getTown(2);
}
Castle castle = null;
Fort fort = null;
ClanHall clanhall = null;
if (player.getClan() != null)
case 1: // Elven
{
// If teleport to clan hall
if (teleportWhere == TeleportWhereType.CLANHALL)
{
clanhall = ClanHallManager.getInstance().getClanHallByOwner(player.getClan());
if (clanhall != null)
{
final ClanHallZone zone = clanhall.getZone();
if (zone != null)
{
return zone.getSpawn();
}
}
}
// If teleport to castle
if (teleportWhere == TeleportWhereType.CASTLE)
{
castle = CastleManager.getInstance().getCastleByOwner(player.getClan());
}
// If teleport to fort
if (teleportWhere == TeleportWhereType.FORTRESS)
{
fort = FortManager.getInstance().getFortByOwner(player.getClan());
}
// Check if player is on castle or fortress ground
if (castle == null)
{
castle = CastleManager.getInstance().getCastle(player);
}
if (fort == null)
{
fort = FortManager.getInstance().getFort(player);
}
if ((castle != null) && (castle.getCastleId() > 0))
{
// If Teleporting to castle or if is on caslte with siege and player's clan is defender
if ((teleportWhere == TeleportWhereType.CASTLE) || ((teleportWhere == TeleportWhereType.CASTLE) && castle.getSiege().isInProgress() && (castle.getSiege().getDefenderClan(player.getClan()) != null)))
{
return castle.getZone().getSpawn();
}
if ((teleportWhere == TeleportWhereType.SIEGEFLAG) && castle.getSiege().isInProgress())
{
// Check if player's clan is attacker
final List<NpcInstance> flags = castle.getSiege().getFlag(player.getClan());
if ((flags != null) && !flags.isEmpty())
{
// Spawn to flag - Need more work to get player to the nearest flag
final NpcInstance flag = flags.get(0);
return new Location(flag.getX(), flag.getY(), flag.getZ());
}
}
}
else if ((fort != null) && (fort.getFortId() > 0))
{
// Teleporting to castle or fortress is on castle with siege and player's clan is defender
if ((teleportWhere == TeleportWhereType.FORTRESS) || ((teleportWhere == TeleportWhereType.FORTRESS) && fort.getSiege().isInProgress() && (fort.getSiege().getDefenderClan(player.getClan()) != null)))
{
return fort.getZone().getSpawn();
}
if ((teleportWhere == TeleportWhereType.SIEGEFLAG) && fort.getSiege().isInProgress())
{
// Check if player's clan is attacker
final List<NpcInstance> flags = fort.getSiege().getFlag(player.getClan());
if ((flags != null) && !flags.isEmpty())
{
// Spawn to flag
final NpcInstance flag = flags.get(0);
return new Location(flag.getX(), flag.getY(), flag.getZ());
}
}
}
return getTown((player.getTemplate().getRace() == Race.DARK_ELF) ? 1 : 3);
}
// Teleport red pk 5+ to Floran Village
if ((player.getPkKills() > 5) && (player.getKarma() > 1))
case 2: // DE
{
return FLORAN_VILLAGE_LOCATION;
return getTown((player.getTemplate().getRace() == Race.ELF) ? 3 : 1);
}
// Karma player land out of city
if (player.getKarma() > 1)
case 3: // Orc
{
final int closest = getMapRegion(creature.getX(), creature.getY());
if ((closest >= 0) && (closest < KARMA_LOCATIONS.size()))
{
return KARMA_LOCATIONS.get(closest);
}
return FLORAN_VILLAGE_LOCATION;
return getTown(4);
}
// Checking if in arena
final ArenaZone arena = ArenaManager.getInstance().getArena(player);
if (arena != null)
case 4: // Dwarven
{
return arena.getSpawnLoc();
return getTown(6);
}
case 5: // Gludio
{
return getTown(7);
}
case 6: // Gludin
{
return getTown(5);
}
case 7: // Dion
{
return getTown(8);
}
case 8: // Giran
case 12: // Giran Harbor
{
return getTown(9);
}
case 9: // Oren
{
return getTown(10);
}
case 10: // Aden
{
return getTown(12);
}
case 11: // HV
{
return getTown(11);
}
case 13: // Heine
{
return getTown(15);
}
case 14: // Rune
{
return getTown(14);
}
case 15: // Goddard
{
return getTown(13);
}
case 16: // Schuttgart
{
return getTown(17);
}
case 17: // Floran
{
return getTown(16);
}
case 18: // Primeval Isle
{
return getTown(19);
}
}
// Get the nearest town
TownZone localZone = null;
if ((creature != null) && ((localZone = TownManager.getInstance().getClosestTown(creature)) != null))
return getTown(16); // Default to floran
}
/**
* @param x : The current character's X location.
* @param y : The current character's Y location.
* @return the closest L2TownZone based on a X/Y location.
*/
private TownZone getClosestTown(int x, int y)
{
switch (getMapRegion(x, y))
{
return localZone.getSpawnLoc();
case 0: // TI
{
return getTown(2);
}
case 1: // Elven
{
return getTown(3);
}
case 2: // DE
{
return getTown(1);
}
case 3: // Orc
{
return getTown(4);
}
case 4: // Dwarven
{
return getTown(6);
}
case 5: // Gludio
{
return getTown(7);
}
case 6: // Gludin
{
return getTown(5);
}
case 7: // Dion
{
return getTown(8);
}
case 8: // Giran
case 12: // Giran Harbor
{
return getTown(9);
}
case 9: // Oren
{
return getTown(10);
}
case 10: // Aden
{
return getTown(12);
}
case 11: // HV
{
return getTown(11);
}
case 13: // Heine
{
return getTown(15);
}
case 14: // Rune
{
return getTown(14);
}
case 15: // Goddard
{
return getTown(13);
}
case 16: // Schuttgart
{
return getTown(17);
}
case 17: // Floran
{
return getTown(16);
}
case 18: // Primeval Isle
{
return getTown(19);
}
}
localZone = TownManager.getInstance().getTown(9); // Giran
return localZone.getSpawnLoc();
return getTown(16); // Default to floran
}
/**
* @param x : The current character's X location.
* @param y : The current character's Y location.
* @return the closest region based on a X/Y location.
*/
public int getClosestLocation(int x, int y)
{
switch (getMapRegion(x, y))
{
case 0: // TI
{
return 1;
}
case 1: // Elven
{
return 4;
}
case 2: // DE
{
return 3;
}
case 3: // Orc
case 4: // Dwarven
case 16: // Schuttgart
{
return 9;
}
case 5: // Gludio
case 6: // Gludin
{
return 2;
}
case 7: // Dion
{
return 5;
}
case 8: // Giran
case 12: // Giran Harbor
{
return 6;
}
case 9: // Oren
{
return 10;
}
case 10: // Aden
{
return 13;
}
case 11: // HV
{
return 11;
}
case 13: // Heine
{
return 12;
}
case 14: // Rune
{
return 14;
}
case 15: // Goddard
{
return 15;
}
}
return 0;
}
/**
* @param townId the townId to match.
* @return a TownZone based on the overall list of TownZone, matching the townId.
*/
public final TownZone getTown(int townId)
{
for (TownZone temp : ZoneData.getInstance().getAllZones(TownZone.class))
{
if (temp.getTownId() == townId)
{
return temp;
}
}
return null;
}
public static MapRegionData getInstance()

View File

@@ -232,10 +232,9 @@ public class AdminSiege implements IAdminCommandHandler
else if (command.equalsIgnoreCase("admin_clanhallteleportself"))
{
final ClanHallZone zone = clanhall.getZone();
if (zone != null)
{
activeChar.teleToLocation(zone.getSpawn(), true);
activeChar.teleToLocation(zone.getSpawnLoc(), true);
}
}
else if (command.equalsIgnoreCase("admin_spawn_doors"))

View File

@@ -16,11 +16,10 @@
*/
package org.l2jmobius.gameserver.handler.admincommandhandlers;
import java.util.Collection;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.datatables.xml.MapRegionData;
import org.l2jmobius.gameserver.datatables.xml.ZoneData;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.instancemanager.TownManager;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -61,63 +60,44 @@ public class AdminTownWar implements IAdminCommandHandler
// All Towns will become War Zones
if (Config.TW_ALL_TOWNS)
{
TownManager.getInstance().getTown(1).setParameter("noPeace", "true");
TownManager.getInstance().getTown(2).setParameter("noPeace", "true");
TownManager.getInstance().getTown(3).setParameter("noPeace", "true");
TownManager.getInstance().getTown(4).setParameter("noPeace", "true");
TownManager.getInstance().getTown(5).setParameter("noPeace", "true");
TownManager.getInstance().getTown(6).setParameter("noPeace", "true");
TownManager.getInstance().getTown(7).setParameter("noPeace", "true");
TownManager.getInstance().getTown(8).setParameter("noPeace", "true");
TownManager.getInstance().getTown(9).setParameter("noPeace", "true");
TownManager.getInstance().getTown(10).setParameter("noPeace", "true");
TownManager.getInstance().getTown(11).setParameter("noPeace", "true");
TownManager.getInstance().getTown(12).setParameter("noPeace", "true");
TownManager.getInstance().getTown(13).setParameter("noPeace", "true");
TownManager.getInstance().getTown(14).setParameter("noPeace", "true");
TownManager.getInstance().getTown(15).setParameter("noPeace", "true");
TownManager.getInstance().getTown(16).setParameter("noPeace", "true");
TownManager.getInstance().getTown(17).setParameter("noPeace", "true");
TownManager.getInstance().getTown(19).setParameter("noPeace", "true");
for (TownZone zone : ZoneData.getInstance().getAllZones(TownZone.class))
{
zone.setParameter("noPeace", "true");
}
}
// A Town will become War Zone
if (!Config.TW_ALL_TOWNS && (Config.TW_TOWN_ID != 18) && (Config.TW_TOWN_ID != 21) && (Config.TW_TOWN_ID != 22))
{
TownManager.getInstance().getTown(Config.TW_TOWN_ID).setParameter("noPeace", "true");
MapRegionData.getInstance().getTown(Config.TW_TOWN_ID).setParameter("noPeace", "true");
}
final Collection<PlayerInstance> pls = World.getInstance().getAllPlayers();
int x;
int y;
int z;
TownZone town;
for (PlayerInstance onlinePlayer : World.getInstance().getAllPlayers())
{
int x;
int y;
int z;
TownZone town;
for (PlayerInstance onlinePlayer : pls)
if (onlinePlayer.isOnline())
{
if (onlinePlayer.isOnline())
x = onlinePlayer.getX();
y = onlinePlayer.getY();
z = onlinePlayer.getZ();
town = ZoneData.getInstance().getZone(x, y, z, TownZone.class);
if (town != null)
{
x = onlinePlayer.getX();
y = onlinePlayer.getY();
z = onlinePlayer.getZ();
town = TownManager.getInstance().getTown(x, y, z);
if (town != null)
if ((town.getTownId() == Config.TW_TOWN_ID) && !Config.TW_ALL_TOWNS)
{
if ((town.getTownId() == Config.TW_TOWN_ID) && !Config.TW_ALL_TOWNS)
{
onlinePlayer.setInsideZone(ZoneId.PVP, false);
onlinePlayer.revalidateZone(true);
}
else if (Config.TW_ALL_TOWNS)
{
onlinePlayer.setInsideZone(ZoneId.PVP, false);
onlinePlayer.revalidateZone(true);
}
onlinePlayer.setInsideZone(ZoneId.PVP, false);
onlinePlayer.revalidateZone(true);
}
else if (Config.TW_ALL_TOWNS)
{
onlinePlayer.setInsideZone(ZoneId.PVP, false);
onlinePlayer.revalidateZone(true);
}
onlinePlayer.setInTownWar(true);
}
onlinePlayer.setInTownWar(true);
}
}
@@ -132,7 +112,7 @@ public class AdminTownWar implements IAdminCommandHandler
if (!Config.TW_ALL_TOWNS)
{
Announcements.getInstance().gameAnnounceToAll("Town War Event!");
Announcements.getInstance().gameAnnounceToAll(TownManager.getInstance().getTown(Config.TW_TOWN_ID).getName() + " has been set to war zone by " + activeChar.getName() + ".");
Announcements.getInstance().gameAnnounceToAll(MapRegionData.getInstance().getTown(Config.TW_TOWN_ID).getName() + " has been set to war zone by " + activeChar.getName() + ".");
}
}
@@ -141,63 +121,58 @@ public class AdminTownWar implements IAdminCommandHandler
// All Towns will become Peace Zones
if (Config.TW_ALL_TOWNS)
{
TownManager.getInstance().getTown(1).setParameter("noPeace", "false");
TownManager.getInstance().getTown(2).setParameter("noPeace", "false");
TownManager.getInstance().getTown(3).setParameter("noPeace", "false");
TownManager.getInstance().getTown(4).setParameter("noPeace", "false");
TownManager.getInstance().getTown(5).setParameter("noPeace", "false");
TownManager.getInstance().getTown(6).setParameter("noPeace", "false");
TownManager.getInstance().getTown(7).setParameter("noPeace", "false");
TownManager.getInstance().getTown(8).setParameter("noPeace", "false");
TownManager.getInstance().getTown(9).setParameter("noPeace", "false");
TownManager.getInstance().getTown(10).setParameter("noPeace", "false");
TownManager.getInstance().getTown(11).setParameter("noPeace", "false");
TownManager.getInstance().getTown(12).setParameter("noPeace", "false");
TownManager.getInstance().getTown(13).setParameter("noPeace", "false");
TownManager.getInstance().getTown(14).setParameter("noPeace", "false");
TownManager.getInstance().getTown(15).setParameter("noPeace", "false");
TownManager.getInstance().getTown(16).setParameter("noPeace", "false");
TownManager.getInstance().getTown(17).setParameter("noPeace", "false");
TownManager.getInstance().getTown(19).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(1).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(2).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(3).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(4).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(5).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(6).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(7).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(8).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(9).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(10).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(11).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(12).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(13).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(14).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(15).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(16).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(17).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(19).setParameter("noPeace", "false");
}
// A Town will become Peace Zone
if (!Config.TW_ALL_TOWNS && (Config.TW_TOWN_ID != 18) && (Config.TW_TOWN_ID != 21) && (Config.TW_TOWN_ID != 22))
{
TownManager.getInstance().getTown(Config.TW_TOWN_ID).setParameter("noPeace", "false");
MapRegionData.getInstance().getTown(Config.TW_TOWN_ID).setParameter("noPeace", "false");
}
final Collection<PlayerInstance> pls = World.getInstance().getAllPlayers();
int x;
int y;
int z;
TownZone town;
for (PlayerInstance onlinePlayer : World.getInstance().getAllPlayers())
{
int x;
int y;
int z;
TownZone town;
for (PlayerInstance onlinePlayer : pls)
if (onlinePlayer.isOnline())
{
if (onlinePlayer.isOnline())
x = onlinePlayer.getX();
y = onlinePlayer.getY();
z = onlinePlayer.getZ();
town = ZoneData.getInstance().getZone(x, y, z, TownZone.class);
if (town != null)
{
x = onlinePlayer.getX();
y = onlinePlayer.getY();
z = onlinePlayer.getZ();
town = TownManager.getInstance().getTown(x, y, z);
if (town != null)
if ((town.getTownId() == Config.TW_TOWN_ID) && !Config.TW_ALL_TOWNS)
{
if ((town.getTownId() == Config.TW_TOWN_ID) && !Config.TW_ALL_TOWNS)
{
onlinePlayer.setInsideZone(ZoneId.PVP, true);
onlinePlayer.revalidateZone(true);
}
else if (Config.TW_ALL_TOWNS)
{
onlinePlayer.setInsideZone(ZoneId.PVP, true);
onlinePlayer.revalidateZone(true);
}
onlinePlayer.setInsideZone(ZoneId.PVP, true);
onlinePlayer.revalidateZone(true);
}
else if (Config.TW_ALL_TOWNS)
{
onlinePlayer.setInsideZone(ZoneId.PVP, true);
onlinePlayer.revalidateZone(true);
}
onlinePlayer.setInTownWar(false);
}
onlinePlayer.setInTownWar(false);
}
}
@@ -210,7 +185,7 @@ public class AdminTownWar implements IAdminCommandHandler
// Announce for one town
if (!Config.TW_ALL_TOWNS)
{
Announcements.getInstance().gameAnnounceToAll(TownManager.getInstance().getTown(Config.TW_TOWN_ID).getName() + " has been set back to normal by " + activeChar.getName() + ".");
Announcements.getInstance().gameAnnounceToAll(MapRegionData.getInstance().getTown(Config.TW_TOWN_ID).getName() + " has been set back to normal by " + activeChar.getName() + ".");
}
}

View File

@@ -18,91 +18,122 @@ package org.l2jmobius.gameserver.handler.admincommandhandlers;
import java.util.StringTokenizer;
import org.l2jmobius.gameserver.datatables.xml.AdminData;
import org.l2jmobius.commons.util.StringUtil;
import org.l2jmobius.gameserver.datatables.xml.MapRegionData;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.datatables.xml.ZoneData;
import org.l2jmobius.gameserver.handler.IAdminCommandHandler;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.util.BuilderUtil;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
/**
* @author luisantonioa
*/
public class AdminZone implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
"admin_zone_check",
"admin_zone_reload"
"admin_zone_visual"
};
@Override
public boolean useAdminCommand(String command, PlayerInstance activeChar)
{
final StringTokenizer st = new StringTokenizer(command, " ");
final String actualCommand = st.nextToken(); // Get actual command
if (activeChar == null)
{
return false;
}
StringTokenizer st = new StringTokenizer(command, " ");
String actualCommand = st.nextToken(); // Get actual command
if (actualCommand.equalsIgnoreCase("admin_zone_check"))
{
if (activeChar.isInsideZone(ZoneId.PVP))
{
BuilderUtil.sendSysMessage(activeChar, "This is a PvP zone.");
}
else
{
BuilderUtil.sendSysMessage(activeChar, "This is NOT a PvP zone.");
}
if (activeChar.isInsideZone(ZoneId.NO_LANDING))
{
BuilderUtil.sendSysMessage(activeChar, "This is a no landing zone.");
}
else
{
BuilderUtil.sendSysMessage(activeChar, "This is NOT a no landing zone.");
}
if (activeChar.isInsideZone(ZoneId.NO_STORE))
{
BuilderUtil.sendSysMessage(activeChar, "This is a no-store zone.");
}
else
{
BuilderUtil.sendSysMessage(activeChar, "This is NOT a no-store zone.");
}
BuilderUtil.sendSysMessage(activeChar, "MapRegion: x:" + MapRegionData.getInstance().getMapRegionX(activeChar.getX()) + " y:" + MapRegionData.getInstance().getMapRegionX(activeChar.getY()));
BuilderUtil.sendSysMessage(activeChar, "Closest Town: " + MapRegionData.getInstance().getClosestTownName(activeChar));
Location loc;
loc = MapRegionData.getInstance().getTeleToLocation(activeChar, TeleportWhereType.CASTLE);
BuilderUtil.sendSysMessage(activeChar, "TeleToLocation (Castle): x:" + loc.getX() + " y:" + loc.getY() + " z:" + loc.getZ());
loc = MapRegionData.getInstance().getTeleToLocation(activeChar, TeleportWhereType.CLANHALL);
BuilderUtil.sendSysMessage(activeChar, "TeleToLocation (ClanHall): x:" + loc.getX() + " y:" + loc.getY() + " z:" + loc.getZ());
loc = MapRegionData.getInstance().getTeleToLocation(activeChar, TeleportWhereType.SIEGEFLAG);
BuilderUtil.sendSysMessage(activeChar, "TeleToLocation (SiegeFlag): x:" + loc.getX() + " y:" + loc.getY() + " z:" + loc.getZ());
loc = MapRegionData.getInstance().getTeleToLocation(activeChar, TeleportWhereType.TOWN);
BuilderUtil.sendSysMessage(activeChar, "TeleToLocation (Town): x:" + loc.getX() + " y:" + loc.getY() + " z:" + loc.getZ());
showHtml(activeChar);
}
else if (actualCommand.equalsIgnoreCase("admin_zone_reload"))
else if (actualCommand.equalsIgnoreCase("admin_zone_visual"))
{
// TODO: ZONETODO ZoneManager.getInstance().reload();
AdminData.broadcastMessageToGMs("Zones can not be reloaded in this version.");
try
{
String next = st.nextToken();
if (next.equalsIgnoreCase("all"))
{
for (ZoneType zone : ZoneData.getInstance().getZones(activeChar))
{
zone.visualizeZone(activeChar.getZ());
}
showHtml(activeChar);
}
else if (next.equalsIgnoreCase("clear"))
{
ZoneData.getInstance().clearDebugItems();
showHtml(activeChar);
}
else
{
int zoneId = Integer.parseInt(next);
ZoneData.getInstance().getZoneById(zoneId).visualizeZone(activeChar.getZ());
}
}
catch (Exception e)
{
activeChar.sendMessage("Invalid parameter for //zone_visual.");
}
}
return true;
}
private static void showHtml(PlayerInstance activeChar)
{
final int x = activeChar.getX();
final int y = activeChar.getY();
final int rx = ((x - World.MAP_MIN_X) >> 15) + World.TILE_X_MIN;
final int ry = ((y - World.MAP_MIN_Y) >> 15) + World.TILE_Y_MIN;
final NpcHtmlMessage html = new NpcHtmlMessage(0);
html.setFile("data/html/admin/zone.htm");
html.replace("%MAPREGION%", "[x:" + MapRegionData.getInstance().getMapRegionX(x) + " y:" + MapRegionData.getInstance().getMapRegionY(y) + "]");
html.replace("%GEOREGION%", rx + "_" + ry);
html.replace("%CLOSESTTOWN%", MapRegionData.getInstance().getClosestTownName(activeChar));
html.replace("%CURRENTLOC%", x + ", " + y + ", " + activeChar.getZ());
html.replace("%PVP%", (activeChar.isInsideZone(ZoneId.PVP) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%PEACE%", (activeChar.isInsideZone(ZoneId.PEACE) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%SIEGE%", (activeChar.isInsideZone(ZoneId.SIEGE) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%MOTHERTREE%", (activeChar.isInsideZone(ZoneId.MOTHERTREE) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%CLANHALL%", (activeChar.isInsideZone(ZoneId.CLAN_HALL) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%NOLANDING%", (activeChar.isInsideZone(ZoneId.NO_LANDING) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%WATER%", (activeChar.isInsideZone(ZoneId.WATER) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%JAIL%", (activeChar.isInsideZone(ZoneId.JAIL) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%MONSTERTRACK%", (activeChar.isInsideZone(ZoneId.MONSTER_TRACK) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%CASTLE%", (activeChar.isInsideZone(ZoneId.CASTLE) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%SWAMP%", (activeChar.isInsideZone(ZoneId.SWAMP) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%NOSUMMONFRIEND%", (activeChar.isInsideZone(ZoneId.NO_SUMMON_FRIEND) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%NOSTORE%", (activeChar.isInsideZone(ZoneId.NO_STORE) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%TOWN%", (activeChar.isInsideZone(ZoneId.TOWN) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%HQ%", (activeChar.isInsideZone(ZoneId.HQ) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%DANGERAREA%", (activeChar.isInsideZone(ZoneId.DANGER_AREA) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%BOSS%", (activeChar.isInsideZone(ZoneId.BOSS) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
html.replace("%NORESTART%", (activeChar.isInsideZone(ZoneId.NO_RESTART) ? "<font color=\"LEVEL\">YES</font>" : "NO"));
final StringBuilder sb = new StringBuilder(100);
for (ZoneType zone : World.getInstance().getRegion(x, y).getZones())
{
if (zone.isCharacterInZone(activeChar))
{
StringUtil.append(sb, zone.getId(), " ");
}
}
html.replace("%ZLIST%", sb.toString());
activeChar.sendPacket(html);
}
@Override
public String[] getAdminCommandList()
{
return ADMIN_COMMANDS;
}
}
}

View File

@@ -165,7 +165,7 @@ public class SiegeFlag implements ISkillHandler
{
message = "You have already placed the maximum number of flags possible.";
}
else if (player.isInsideZone(ZoneId.NO_HQ))
else if (!player.isInsideZone(ZoneId.HQ))
{
message = "You cannot place flag here.";
}
@@ -210,7 +210,7 @@ public class SiegeFlag implements ISkillHandler
{
message = "You have already placed the maximum number of flags possible.";
}
else if (player.isInsideZone(ZoneId.NO_HQ))
else if (!player.isInsideZone(ZoneId.HQ))
{
message = "You cannot place flag here.";
}

View File

@@ -42,7 +42,7 @@ public class Escape implements IUserCommandHandler
@Override
public boolean useUserCommand(int id, PlayerInstance player)
{
final int unstuckTimer = player.getAccessLevel().isGm() ? 1000 : Config.UNSTUCK_INTERVAL * 1000;
final int unstuckTimer = player.isGM() ? 1000 : Config.UNSTUCK_INTERVAL * 1000;
// Check to see if the current player is in Festival.
if (player.isFestivalParticipant())

View File

@@ -36,11 +36,6 @@ public class CastleManager
{
protected static final Logger LOGGER = Logger.getLogger(CastleManager.class.getName());
public static final CastleManager getInstance()
{
return SingletonHolder.INSTANCE;
}
private static final List<Castle> _castles = new CopyOnWriteArrayList<>();
private static final int[] _castleCirclets =
@@ -62,25 +57,23 @@ public class CastleManager
load();
}
public int findNearestCastlesIndex(WorldObject obj)
public int findNearestCastleIndex(WorldObject obj)
{
int index = getCastleIndex(obj);
if (index < 0)
{
double closestDistance = 99999999;
double closestDistance = Double.MAX_VALUE;
double distance;
Castle castle;
for (int i = 0; i < getCastles().size(); i++)
{
castle = getCastles().get(i);
if (castle == null)
{
continue;
}
distance = castle.getDistance(obj);
if (closestDistance > distance)
{
closestDistance = distance;
@@ -91,6 +84,28 @@ public class CastleManager
return index;
}
public Castle findNearestCastle(int x, int y)
{
double closestDistance = Double.MAX_VALUE;
double distance;
Castle result = null;
for (Castle castle : _castles)
{
if (castle == null)
{
continue;
}
distance = castle.getZone().getDistanceToZone(x, y);
if (closestDistance > distance)
{
closestDistance = distance;
result = castle;
}
}
return result;
}
private final void load()
{
LOGGER.info("Initializing CastleManager");
@@ -354,6 +369,11 @@ public class CastleManager
}
}
public static final CastleManager getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final CastleManager INSTANCE = new CastleManager();

View File

@@ -1,323 +0,0 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.instancemanager;
import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.gameserver.datatables.xml.MapRegionData;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.entity.siege.Castle;
import org.l2jmobius.gameserver.model.zone.type.TownZone;
public class TownManager
{
private List<TownZone> _towns;
private TownManager()
{
}
public void addTown(TownZone arena)
{
if (_towns == null)
{
_towns = new ArrayList<>();
}
_towns.add(arena);
}
public TownZone getClosestTown(WorldObject activeObject)
{
switch (MapRegionData.getInstance().getMapRegion(activeObject.getPosition().getX(), activeObject.getPosition().getY()))
{
case 0:
{
return getTown(2); // TI
}
case 1:
{
return getTown(3); // Elven
}
case 2:
{
return getTown(1); // DE
}
case 3:
{
return getTown(4); // Orc
}
case 4:
{
return getTown(6); // Dwarven
}
case 5:
{
return getTown(7); // Gludio
}
case 6:
{
return getTown(5); // Gludin
}
case 7:
{
return getTown(8); // Dion
}
case 8:
{
return getTown(9); // Giran
}
case 9:
{
return getTown(10); // Oren
}
case 10:
{
return getTown(12); // Aden
}
case 11:
{
return getTown(11); // HV
}
case 12:
{
return getTown(9); // Giran Harbour
}
case 13:
{
return getTown(15); // Heine
}
case 14:
{
return getTown(14); // Rune
}
case 15:
{
return getTown(13); // Goddard
}
case 16:
{
return getTown(17); // Schuttgart
}
case 17:
{
return getTown(16); // Floran
}
case 18:
{
return getTown(19); // Primeval Isle
}
}
return getTown(16); // Default to floran
}
public static final int getClosestLocation(WorldObject activeObject)
{
switch (MapRegionData.getInstance().getMapRegion(activeObject.getPosition().getX(), activeObject.getPosition().getY()))
{
case 0:
{
return 1; // TI
}
case 1:
{
return 4; // Elven
}
case 2:
{
return 3; // DE
}
case 3:
{
return 9; // Orc
}
case 4:
{
return 9; // Dwarven
}
case 5:
{
return 2; // Gludio
}
case 6:
{
return 2; // Gludin
}
case 7:
{
return 5; // Dion
}
case 8:
{
return 6; // Giran
}
case 9:
{
return 10; // Oren
}
case 10:
{
return 13; // Aden
}
case 11:
{
return 11; // HV
}
case 12:
{
return 6; // Giran Harbour
}
case 13:
{
return 12; // Heine
}
case 14:
{
return 14; // Rune
}
case 15:
{
return 15; // Goddard
}
case 16:
{
return 9; // Schuttgart
}
}
return 0;
}
public boolean townHasCastleInSiege(int townId)
{
final int[] castleidarray =
{
0,
0,
0,
0,
0,
0,
0,
1,
2,
3,
4,
0,
5,
7,
8,
6,
0,
9,
0
};
final int castleIndex = castleidarray[townId];
if (castleIndex > 0)
{
final Castle castle = CastleManager.getInstance().getCastles().get(CastleManager.getInstance().getCastleIndex(castleIndex));
if (castle != null)
{
return castle.getSiege().isInProgress();
}
}
return false;
}
public boolean townHasCastleInSiege(int x, int y)
{
final int curtown = MapRegionData.getInstance().getMapRegion(x, y);
final int[] castleidarray =
{
0,
0,
0,
0,
0,
1,
0,
2,
3,
4,
5,
0,
0,
6,
8,
7,
9,
0,
0
};
// find an instance of the castle for this town.
final int castleIndex = castleidarray[curtown];
if (castleIndex > 0)
{
final Castle castle = CastleManager.getInstance().getCastles().get(CastleManager.getInstance().getCastleIndex(castleIndex));
if (castle != null)
{
return castle.getSiege().isInProgress();
}
}
return false;
}
public TownZone getTown(int townId)
{
for (TownZone temp : _towns)
{
if (temp.getTownId() == townId)
{
return temp;
}
}
return null;
}
/**
* Returns the town at that position (if any)
* @param x
* @param y
* @param z
* @return
*/
public TownZone getTown(int x, int y, int z)
{
for (TownZone temp : _towns)
{
if (temp.isInsideZone(x, y, z))
{
return temp;
}
}
return null;
}
public static TownManager getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final TownManager INSTANCE = new TownManager();
}
}

View File

@@ -17,6 +17,8 @@
package org.l2jmobius.gameserver.model;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.logging.Logger;
@@ -76,6 +78,15 @@ public class WorldRegion
_zoneManager.unregisterZone(zone);
}
public List<ZoneType> getZones()
{
if (_zoneManager == null)
{
return Collections.emptyList();
}
return _zoneManager.getZones();
}
public void revalidateZones(Creature creature)
{
if (_zoneManager == null)

View File

@@ -40,6 +40,7 @@ import org.l2jmobius.gameserver.datatables.HeroSkillTable;
import org.l2jmobius.gameserver.datatables.SkillTable;
import org.l2jmobius.gameserver.datatables.sql.NpcTable;
import org.l2jmobius.gameserver.datatables.xml.MapRegionData;
import org.l2jmobius.gameserver.datatables.xml.ZoneData;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.handler.ISkillHandler;
@@ -49,7 +50,6 @@ import org.l2jmobius.gameserver.instancemanager.DimensionalRiftManager;
import org.l2jmobius.gameserver.instancemanager.DuelManager;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.RaidBossSpawnManager;
import org.l2jmobius.gameserver.instancemanager.TownManager;
import org.l2jmobius.gameserver.model.ChanceSkillList;
import org.l2jmobius.gameserver.model.Effect;
import org.l2jmobius.gameserver.model.ForceBuff;
@@ -663,14 +663,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder
{
if (Config.TW_DISABLE_GK)
{
int x1;
int y1;
int z1;
x1 = getX();
y1 = getY();
z1 = getZ();
TownZone town;
town = TownManager.getInstance().getTown(x1, y1, z1);
final TownZone town = ZoneData.getInstance().getZone(getX(), getY(), getZ(), TownZone.class);
if ((town != null) && _inTownWar)
{
if ((town.getTownId() == Config.TW_TOWN_ID) && !Config.TW_ALL_TOWNS)
@@ -6513,7 +6506,6 @@ public abstract class Creature extends WorldObject implements ISkillsHolder
int bossId = -1;
NpcTemplate bossTemplate = null;
final BossZone bossZone = GrandBossManager.getInstance().getZone(this);
if (bossZone != null)
{
bossId = bossZone.getBossId();
@@ -8301,7 +8293,6 @@ public abstract class Creature extends WorldObject implements ISkillsHolder
{
// Set some values inside target's instance for later use
final Creature creature = (Creature) target;
if ((skill.getEffectType() == SkillType.BUFF) && creature.isBlockBuff())
{
continue;
@@ -8310,7 +8301,6 @@ public abstract class Creature extends WorldObject implements ISkillsHolder
if (target instanceof Creature)
{
final Creature targ = (Creature) target;
if (ChanceSkillList.canTriggerByCast(this, targ, skill))
{
// Maybe launch chance skills on us
@@ -8345,7 +8335,6 @@ public abstract class Creature extends WorldObject implements ISkillsHolder
int bossId = -1;
NpcTemplate bossTemplate = null;
final BossZone bossZone = GrandBossManager.getInstance().getZone(this);
if (bossZone != null)
{
bossId = bossZone.getBossId();

View File

@@ -534,8 +534,7 @@ public class DoorInstance extends Creature
// Send a Server->Client packet MyTargetSelected to the PlayerInstance player
player.sendPacket(new MyTargetSelected(getObjectId(), 0));
final DoorStatusUpdate su = new DoorStatusUpdate(this);
player.sendPacket(su);
player.sendPacket(new DoorStatusUpdate(this));
// Send a Server->Client packet ValidateLocation to correct the NpcInstance position and heading on the client
player.sendPacket(new ValidateLocation(this));
@@ -580,31 +579,25 @@ public class DoorInstance extends Creature
return;
}
if (player.getAccessLevel().isGm())
if (player.isGM())
{
player.setTarget(this);
player.sendPacket(new MyTargetSelected(getObjectId(), player.getLevel()));
if (isAutoAttackable(player))
{
final DoorStatusUpdate su = new DoorStatusUpdate(this);
player.sendPacket(su);
player.sendPacket(new DoorStatusUpdate(this));
}
final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
final StringBuilder html1 = new StringBuilder("<html><body><table border=0>");
html1.append("<tr><td><font color=\"LEVEL\">Door Information</font><br></td></tr>");
html1.append("<tr><td>Current HP " + getCurrentHp() + "</td></tr>");
html1.append("<tr><td>Max HP " + getMaxHp() + "</td></tr>");
html1.append("<tr><td>Object ID: " + getObjectId() + "</td></tr>");
html1.append("<tr><td>Door ID: " + _doorId + "</td></tr>");
html1.append("<tr><td><br></td></tr>");
html1.append("<tr><td>Class: " + getClass().getSimpleName() + "</td></tr>");
html1.append("<tr><td><br></td></tr>");
html1.append("</table>");
html1.append("<table><tr>");
html1.append("<td><button value=\"Open\" action=\"bypass -h admin_open " + _doorId + "\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
html1.append("<td><button value=\"Close\" action=\"bypass -h admin_close " + _doorId + "\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>");
@@ -623,8 +616,7 @@ public class DoorInstance extends Creature
if (isAutoAttackable(player))
{
final DoorStatusUpdate su = new DoorStatusUpdate(this);
player.sendPacket(su);
player.sendPacket(new DoorStatusUpdate(this));
}
final NpcHtmlMessage reply = new NpcHtmlMessage(5);
@@ -643,14 +635,12 @@ public class DoorInstance extends Creature
public void broadcastStatusUpdate()
{
final Collection<PlayerInstance> knownPlayers = getKnownList().getKnownPlayers().values();
if ((knownPlayers == null) || knownPlayers.isEmpty())
{
return;
}
final DoorStatusUpdate su = new DoorStatusUpdate(this);
for (PlayerInstance player : knownPlayers)
{
player.sendPacket(su);

View File

@@ -293,7 +293,7 @@ public class MerchantInstance extends FolkInstance
return;
}
if (player.getAccessLevel().isGm())
if (player.isGM())
{
player.setTarget(this);

View File

@@ -31,13 +31,13 @@ import org.l2jmobius.gameserver.datatables.SkillTable;
import org.l2jmobius.gameserver.datatables.sql.ClanTable;
import org.l2jmobius.gameserver.datatables.sql.HelperBuffTable;
import org.l2jmobius.gameserver.datatables.sql.SpawnTable;
import org.l2jmobius.gameserver.datatables.xml.ZoneData;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.CustomNpcInstanceManager;
import org.l2jmobius.gameserver.instancemanager.DimensionalRiftManager;
import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.TownManager;
import org.l2jmobius.gameserver.model.DropCategory;
import org.l2jmobius.gameserver.model.DropData;
import org.l2jmobius.gameserver.model.Skill;
@@ -829,7 +829,7 @@ public class NpcInstance extends Creature
final Weapon currentWeapon = player.getActiveWeaponItem();
// Check if the PlayerInstance is a GM
if (player.getAccessLevel().isGm())
if (player.isGM())
{
// Set the target of the PlayerInstance player
player.setTarget(this);
@@ -1135,8 +1135,7 @@ public class NpcInstance extends Creature
// Get castle this NPC belongs to (excluding Attackable)
if (_castleIndex < 0)
{
final TownZone town = TownManager.getInstance().getTown(getX(), getY(), getZ());
final TownZone town = ZoneData.getInstance().getZone(getX(), getY(), getZ(), TownZone.class);
if (town != null)
{
_castleIndex = CastleManager.getInstance().getCastleIndex(town.getTaxById());
@@ -1144,7 +1143,7 @@ public class NpcInstance extends Creature
if (_castleIndex < 0)
{
_castleIndex = CastleManager.getInstance().findNearestCastlesIndex(this);
_castleIndex = CastleManager.getInstance().findNearestCastleIndex(this);
}
else
{

View File

@@ -66,6 +66,7 @@ import org.l2jmobius.gameserver.datatables.xml.FishData;
import org.l2jmobius.gameserver.datatables.xml.HennaData;
import org.l2jmobius.gameserver.datatables.xml.MapRegionData;
import org.l2jmobius.gameserver.datatables.xml.RecipeData;
import org.l2jmobius.gameserver.datatables.xml.ZoneData;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
@@ -86,7 +87,6 @@ import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
import org.l2jmobius.gameserver.instancemanager.PlayerCountManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.instancemanager.TownManager;
import org.l2jmobius.gameserver.model.AccessLevel;
import org.l2jmobius.gameserver.model.BlockList;
import org.l2jmobius.gameserver.model.Effect;
@@ -6090,14 +6090,7 @@ public class PlayerInstance extends Playable
{
if (Config.TW_RESS_ON_DIE)
{
int x1;
int y1;
int z1;
x1 = getX();
y1 = getY();
z1 = getZ();
TownZone town;
town = TownManager.getInstance().getTown(x1, y1, z1);
final TownZone town = ZoneData.getInstance().getZone(getX(), getY(), getZ(), TownZone.class);
if ((town != null) && isinTownWar())
{
if ((town.getTownId() == Config.TW_TOWN_ID) && !Config.TW_ALL_TOWNS)
@@ -6769,14 +6762,7 @@ public class PlayerInstance extends Playable
*/
public void increasePvpKills()
{
int x;
int y;
int z;
x = getX();
y = getY();
z = getZ();
TownZone town;
town = TownManager.getInstance().getTown(x, y, z);
final TownZone town = ZoneData.getInstance().getZone(getX(), getY(), getZ(), TownZone.class);
if ((town != null) && isinTownWar())
{
if ((town.getTownId() == Config.TW_TOWN_ID) && !Config.TW_ALL_TOWNS)
@@ -7117,18 +7103,9 @@ public class PlayerInstance extends Playable
}
// Add karma to attacker and increase its PK counter
int x;
int y;
int z;
x = getX();
y = getY();
z = getZ();
// get local town
final TownZone town = TownManager.getInstance().getTown(x, y, z);
setPkKills(getPkKills() + 1);
final TownZone town = ZoneData.getInstance().getZone(getX(), getY(), getZ(), TownZone.class);
if ((town == null) || (isinTownWar() && Config.TW_ALLOW_KARMA))
{
setKarma(getKarma() + newKarma);

View File

@@ -20,14 +20,15 @@ import java.util.StringTokenizer;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.datatables.sql.TeleportLocationTable;
import org.l2jmobius.gameserver.datatables.xml.ZoneData;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.instancemanager.TownManager;
import org.l2jmobius.gameserver.model.TeleportLocation;
import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate;
import org.l2jmobius.gameserver.model.entity.olympiad.Olympiad;
import org.l2jmobius.gameserver.model.zone.type.BossZone;
import org.l2jmobius.gameserver.model.zone.type.TownZone;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
import org.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
@@ -217,7 +218,7 @@ public class TeleporterInstance extends FolkInstance
player.sendPacket(SystemMessageId.NO_PORT_THAT_IS_IN_SIGE);
return;
}
else if (!SiegeManager.getInstance().isTeleportToSiegeTownAllowed() && TownManager.getInstance().townHasCastleInSiege(list.getX(), list.getY()) && !player.isNoble())
else if (!SiegeManager.getInstance().isTeleportToSiegeTownAllowed() && (ZoneData.getInstance().getZone(list.getX(), list.getY(), list.getZ(), TownZone.class) != null) && CastleManager.getInstance().findNearestCastle(list.getX(), list.getY()).getSiege().isInProgress() && !player.isNoble())
{
player.sendPacket(SystemMessageId.NO_PORT_THAT_IS_IN_SIGE);
return;

View File

@@ -19,7 +19,7 @@ package org.l2jmobius.gameserver.model.partymatching;
import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.gameserver.instancemanager.TownManager;
import org.l2jmobius.gameserver.datatables.xml.MapRegionData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ExManagePartyRoomMember;
@@ -44,7 +44,7 @@ public class PartyMatchRoom
_id = id;
_title = title;
_loot = loot;
_location = TownManager.getClosestLocation(owner);
_location = MapRegionData.getInstance().getClosestLocation(owner.getX(), owner.getY());
_minlvl = minlvl;
_maxlvl = maxlvl;
_maxmem = maxmem;

View File

@@ -0,0 +1,78 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.zone;
import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.model.Location;
/**
* Abstract zone with spawn locations.<br>
* It inherits regular ZoneType behavior, with the possible addition of 2 Lists holding Locations.
*/
public abstract class SpawnZone extends ZoneType
{
private List<Location> _spawnLocs = null;
private List<Location> _chaoticSpawnLocs = null;
public SpawnZone(int id)
{
super(id);
}
public final void addSpawn(int x, int y, int z)
{
if (_spawnLocs == null)
{
_spawnLocs = new ArrayList<>();
}
_spawnLocs.add(new Location(x, y, z));
}
public final void addChaoticSpawn(int x, int y, int z)
{
if (_chaoticSpawnLocs == null)
{
_chaoticSpawnLocs = new ArrayList<>();
}
_chaoticSpawnLocs.add(new Location(x, y, z));
}
public final List<Location> getSpawns()
{
return _spawnLocs;
}
public final Location getSpawnLoc()
{
return _spawnLocs.get(Rnd.get(_spawnLocs.size()));
}
public final Location getChaoticSpawnLoc()
{
if (_chaoticSpawnLocs != null)
{
return _chaoticSpawnLocs.get(Rnd.get(_chaoticSpawnLocs.size()));
}
return getSpawnLoc();
}
}

View File

@@ -16,12 +16,20 @@
*/
package org.l2jmobius.gameserver.model.zone;
import java.awt.geom.Line2D;
import org.l2jmobius.gameserver.datatables.xml.ZoneData;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
/**
* Abstract base class for any zone form
* @author durgus
*/
public abstract class ZoneForm
{
protected static final int STEP = 50;
public abstract boolean isInsideZone(int x, int y, int z);
public abstract boolean intersectsRectangle(int x1, int x2, int y1, int y2);
@@ -32,11 +40,13 @@ public abstract class ZoneForm
public abstract int getHighZ(); // New fishing patch makes use of that to get the Z for the hook
public abstract void visualizeZone(int id, int z);
// landing coordinates.
protected boolean lineSegmentsIntersect(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2)
{
return java.awt.geom.Line2D.linesIntersect(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2);
return Line2D.linesIntersect(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2);
}
protected boolean lineIntersectsLine(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2)
@@ -82,4 +92,13 @@ public abstract class ZoneForm
{
return b > a ? (c >= a) && (c <= b) : (c >= b) && (c <= a);
}
protected static final void dropDebugItem(int id, int x, int y, int z)
{
final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 57);
item.setCount(id);
item.spawnMe(x, y, z + 5);
ZoneData.getInstance().addDebugItem(item);
}
}

View File

@@ -22,22 +22,26 @@ package org.l2jmobius.gameserver.model.zone;
*/
public enum ZoneId
{
PVP,
PEACE,
SIEGE,
MOTHERTREE,
BOSS,
CASTLE,
CLAN_HALL,
UNUSED,
NO_LANDING,
WATER,
DANGER_AREA,
HQ,
JAIL,
MONSTER_TRACK,
SWAMP,
MOTHERTREE,
NO_LANDING,
NO_RESTART,
NO_STORE,
NO_SUMMON_FRIEND,
OLYMPIAD,
NO_HQ,
DANGER_AREA,
NO_STORE;
PEACE,
PVP,
SCRIPT,
SIEGE,
TOWN,
SWAMP,
WATER;
public static int getZoneCount()
{

View File

@@ -19,8 +19,6 @@ package org.l2jmobius.gameserver.model.zone;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.w3c.dom.Node;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -149,10 +147,6 @@ public abstract class ZoneType
}
}
public void setSpawnLocs(Node node1)
{
}
/**
* Checks if the given character is affected by this zone
* @param creature
@@ -364,4 +358,9 @@ public abstract class ZoneType
{
return _characterList;
}
public void visualizeZone(int z)
{
getZone().visualizeZone(_id, z);
}
}

View File

@@ -198,4 +198,21 @@ public class ZoneCuboid extends ZoneForm
{
return _z2;
}
@Override
public void visualizeZone(int id, int z)
{
// x1->x2
for (int x = _x1; x < _x2; x = x + STEP)
{
dropDebugItem(id, x, _y1, z);
dropDebugItem(id, x, _y2, z);
}
// y1->y2
for (int y = _y1; y < _y2; y = y + STEP)
{
dropDebugItem(id, _x1, y, z);
dropDebugItem(id, _x2, y, z);
}
}
}

View File

@@ -130,4 +130,17 @@ public class ZoneCylinder extends ZoneForm
{
return _z2;
}
@Override
public void visualizeZone(int id, int z)
{
int count = (int) ((2 * Math.PI * _rad) / STEP);
double angle = (2 * Math.PI) / count;
for (int i = 0; i < count; i++)
{
int x = (int) (Math.cos(angle * i) * _rad);
int y = (int) (Math.sin(angle * i) * _rad);
dropDebugItem(id, _x + x, _y + y, z);
}
}
}

View File

@@ -136,4 +136,27 @@ public class ZoneNPoly extends ZoneForm
{
return _z2;
}
@Override
public void visualizeZone(int id, int z)
{
for (int i = 0; i < _x.length; i++)
{
int nextIndex = i + 1;
// ending point to first one
if (nextIndex == _x.length)
{
nextIndex = 0;
}
int vx = _x[nextIndex] - _x[i];
int vy = _y[nextIndex] - _y[i];
float lenght = (float) Math.sqrt((vx * vx) + (vy * vy));
lenght /= STEP;
for (int o = 1; o <= lenght; o++)
{
float k = o / lenght;
dropDebugItem(id, (int) (_x[i] + (k * vx)), (int) (_y[i] + (k * vy)), z);
}
}
}
}

View File

@@ -17,58 +17,28 @@
package org.l2jmobius.gameserver.model.zone.type;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.SpawnZone;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.SystemMessageId;
/**
* An arena
* @author durgus
*/
public class ArenaZone extends ZoneType
public class ArenaZone extends SpawnZone
{
private final Location _spawnLoc = new Location(0, 0, 0);
public ArenaZone(int id)
{
super(id);
}
@Override
public void setParameter(String name, String value)
{
switch (name)
{
case "spawnX":
{
_spawnLoc.setX(Integer.parseInt(value));
break;
}
case "spawnY":
{
_spawnLoc.setY(Integer.parseInt(value));
break;
}
case "spawnZ":
{
_spawnLoc.setZ(Integer.parseInt(value));
break;
}
default:
{
super.setParameter(name, value);
break;
}
}
}
@Override
protected void onEnter(Creature creature)
{
creature.setInsideZone(ZoneId.PVP, true);
creature.setInsideZone(ZoneId.NO_SUMMON_FRIEND, true);
if (creature instanceof PlayerInstance)
{
@@ -80,6 +50,7 @@ public class ArenaZone extends ZoneType
protected void onExit(Creature creature)
{
creature.setInsideZone(ZoneId.PVP, false);
creature.setInsideZone(ZoneId.NO_SUMMON_FRIEND, false);
if (creature instanceof PlayerInstance)
{
@@ -126,9 +97,4 @@ public class ArenaZone extends ZoneType
}
}
}
public Location getSpawnLoc()
{
return _spawnLoc;
}
}

View File

@@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.NpcInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -90,7 +91,14 @@ public class BossZone extends ZoneType
*/
protected void onEnter(Creature creature)
{
if (_enabled && (creature instanceof PlayerInstance))
if (!_enabled)
{
return;
}
creature.setInsideZone(ZoneId.BOSS, true);
if (creature instanceof PlayerInstance)
{
final PlayerInstance player = (PlayerInstance) creature;
@@ -163,7 +171,6 @@ public class BossZone extends ZoneType
* @param y
* @param z
*/
public void movePlayersTo(int x, int y, int z)
{
if (_characterList.isEmpty())
@@ -187,7 +194,14 @@ public class BossZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
if (_enabled && (creature instanceof PlayerInstance))
if (!_enabled)
{
return;
}
creature.setInsideZone(ZoneId.BOSS, false);
if (creature instanceof PlayerInstance)
{
// Thread.dumpStack();
final PlayerInstance player = (PlayerInstance) creature;

View File

@@ -19,25 +19,22 @@ package org.l2jmobius.gameserver.model.zone.type;
import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.instance.SiegeSummonInstance;
import org.l2jmobius.gameserver.model.entity.siege.Castle;
import org.l2jmobius.gameserver.model.zone.SpawnZone;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.SystemMessageId;
/**
* A castle zone
* @author durgus
*/
public class CastleZone extends ZoneType
public class CastleZone extends SpawnZone
{
private Castle _castle;
private final Location _spawnLoc = new Location(0, 0, 0);
public CastleZone(int id)
{
@@ -57,21 +54,6 @@ public class CastleZone extends ZoneType
_castle.setZone(this);
break;
}
case "spawnX":
{
_spawnLoc.setX(Integer.parseInt(value));
break;
}
case "spawnY":
{
_spawnLoc.setY(Integer.parseInt(value));
break;
}
case "spawnZ":
{
_spawnLoc.setZ(Integer.parseInt(value));
break;
}
default:
{
super.setParameter(name, value);
@@ -83,6 +65,8 @@ public class CastleZone extends ZoneType
@Override
protected void onEnter(Creature creature)
{
creature.setInsideZone(ZoneId.CASTLE, true);
if (_castle.getSiege().isInProgress())
{
creature.setInsideZone(ZoneId.PVP, true);
@@ -98,6 +82,8 @@ public class CastleZone extends ZoneType
@Override
protected void onExit(Creature creature)
{
creature.setInsideZone(ZoneId.CASTLE, false);
if (_castle.getSiege().isInProgress())
{
creature.setInsideZone(ZoneId.PVP, false);
@@ -189,7 +175,7 @@ public class CastleZone extends ZoneType
continue;
}
((PlayerInstance) temp).teleToLocation(TeleportWhereType.TOWN);
((PlayerInstance) temp).teleToLocation(getChaoticSpawnLoc(), true);
}
}
@@ -227,11 +213,6 @@ public class CastleZone extends ZoneType
return players;
}
public Location getSpawn()
{
return _spawnLoc;
}
public boolean isSiegeActive()
{
if (_castle != null)

View File

@@ -20,28 +20,24 @@ import java.util.Map;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.ClanHallManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.entity.ClanHall;
import org.l2jmobius.gameserver.model.zone.SpawnZone;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.ClanHallDecoration;
/**
* A clan hall zone
* @author durgus
*/
public class ClanHallZone extends ZoneType
public class ClanHallZone extends SpawnZone
{
private int _clanHallId;
private final int[] _spawnLoc;
public ClanHallZone(int id)
{
super(id);
_spawnLoc = new int[3];
}
@Override
@@ -56,21 +52,6 @@ public class ClanHallZone extends ZoneType
ClanHallManager.getInstance().getClanHallById(_clanHallId).setZone(this);
break;
}
case "spawnX":
{
_spawnLoc[0] = Integer.parseInt(value);
break;
}
case "spawnY":
{
_spawnLoc[1] = Integer.parseInt(value);
break;
}
case "spawnZ":
{
_spawnLoc[2] = Integer.parseInt(value);
break;
}
default:
{
super.setParameter(name, value);
@@ -100,7 +81,7 @@ public class ClanHallZone extends ZoneType
// Send a message
if ((clanHall.getOwnerId() != 0) && (clanHall.getOwnerId() == ((PlayerInstance) creature).getClanId()))
{
((PlayerInstance) creature).sendMessage("You have entered your clan hall");
((PlayerInstance) creature).sendMessage("You have entered your clan hall.");
}
}
}
@@ -116,7 +97,7 @@ public class ClanHallZone extends ZoneType
// Send a message
if ((((PlayerInstance) creature).getClanId() != 0) && (ClanHallManager.getInstance().getClanHallById(_clanHallId).getOwnerId() == ((PlayerInstance) creature).getClanId()))
{
((PlayerInstance) creature).sendMessage("You have left your clan hall");
((PlayerInstance) creature).sendMessage("You have left your clan hall.");
}
}
}
@@ -158,13 +139,4 @@ public class ClanHallZone extends ZoneType
{
return _characterList;
}
/**
* Get the clan hall's spawn
* @return
*/
public Location getSpawn()
{
return new Location(_spawnLoc[0], _spawnLoc[1], _spawnLoc[2]);
}
}

View File

@@ -1,111 +0,0 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.zone.type;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.ZoneType;
public class CustomZone extends ZoneType
{
public CustomZone(int id)
{
super(id);
_isFlyingEnable = true;
}
@Override
protected void onDieInside(Creature l2character)
{
}
@Override
protected void onReviveInside(Creature l2character)
{
}
@Override
public void setParameter(String name, String value)
{
switch (name)
{
case "name":
{
_zoneName = value;
break;
}
case "flying":
{
_isFlyingEnable = Boolean.parseBoolean(value);
break;
}
default:
{
super.setParameter(name, value);
break;
}
}
}
@Override
protected void onEnter(Creature creature)
{
if (creature instanceof PlayerInstance)
{
final PlayerInstance player = (PlayerInstance) creature;
if (!player.isGM() && player.isFlying() && !player.isInJail() && !_isFlyingEnable)
{
player.teleToLocation(TeleportWhereType.TOWN);
}
if (_zoneName.equalsIgnoreCase("tradeoff"))
{
player.sendMessage("Trade restrictions are involved.");
player.setTradeDisabled(true);
}
}
}
@Override
protected void onExit(Creature creature)
{
if (creature instanceof PlayerInstance)
{
final PlayerInstance player = (PlayerInstance) creature;
if (_zoneName.equalsIgnoreCase("tradeoff"))
{
player.sendMessage("Trade restrictions removed.");
player.setTradeDisabled(false);
}
}
}
public String getZoneName()
{
return _zoneName;
}
public boolean isFlyingEnable()
{
return _isFlyingEnable;
}
private String _zoneName;
private boolean _isFlyingEnable;
}

View File

@@ -21,23 +21,21 @@ import java.util.List;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.instance.SiegeSummonInstance;
import org.l2jmobius.gameserver.model.entity.siege.Fort;
import org.l2jmobius.gameserver.model.zone.SpawnZone;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.SystemMessageId;
/**
* A castle zone
* @author programmos
*/
public class FortZone extends ZoneType
public class FortZone extends SpawnZone
{
private Fort _fort;
private final Location _spawnLoc = new Location(0, 0, 0);
public FortZone(int id)
{
@@ -57,21 +55,6 @@ public class FortZone extends ZoneType
_fort.setZone(this);
break;
}
case "spawnX":
{
_spawnLoc.setX(Integer.parseInt(value));
break;
}
case "spawnY":
{
_spawnLoc.setY(Integer.parseInt(value));
break;
}
case "spawnZ":
{
_spawnLoc.setZ(Integer.parseInt(value));
break;
}
default:
{
super.setParameter(name, value);
@@ -215,7 +198,6 @@ public class FortZone extends ZoneType
public List<PlayerInstance> getAllPlayers()
{
final List<PlayerInstance> players = new ArrayList<>();
for (Creature temp : _characterList.values())
{
if (temp instanceof PlayerInstance)
@@ -223,16 +205,6 @@ public class FortZone extends ZoneType
players.add((PlayerInstance) temp);
}
}
return players;
}
/**
* Get the forts defender spawn
* @return
*/
public Location getSpawn()
{
return _spawnLoc;
}
}

View File

@@ -0,0 +1,62 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.zone.type;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
* The only zone where 'Build Headquarters' is allowed.
* @author Tryskell, reverted version of Gnat's NoHqZone
*/
public class HqZone extends ZoneType
{
public HqZone(final int id)
{
super(id);
}
@Override
protected void onEnter(final Creature character)
{
if (character instanceof PlayerInstance)
{
character.setInsideZone(ZoneId.HQ, true);
}
}
@Override
protected void onExit(final Creature character)
{
if (character instanceof PlayerInstance)
{
character.setInsideZone(ZoneId.HQ, false);
}
}
@Override
public void onDieInside(final Creature character)
{
}
@Override
public void onReviveInside(final Creature character)
{
}
}

View File

@@ -40,7 +40,6 @@ public class MotherTreeZone extends ZoneType
if (creature instanceof PlayerInstance)
{
final PlayerInstance player = (PlayerInstance) creature;
if (player.isInParty())
{
for (PlayerInstance member : player.getParty().getPartyMembers())

View File

@@ -1,62 +1,62 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.zone.type;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
* Zone where 'Build Headquarters' is not allowed.
* @author Gnat
*/
public class NoHqZone extends ZoneType
{
public NoHqZone(int id)
{
super(id);
}
@Override
protected void onEnter(Creature creature)
{
if (creature instanceof PlayerInstance)
{
creature.setInsideZone(ZoneId.NO_HQ, true);
}
}
@Override
protected void onExit(Creature creature)
{
if (creature instanceof PlayerInstance)
{
creature.setInsideZone(ZoneId.NO_HQ, false);
}
}
@Override
public void onDieInside(Creature creature)
{
}
@Override
public void onReviveInside(Creature creature)
{
}
}
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.zone.type;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
* A simple no restart zone
* @author GKR
*/
public class NoRestartZone extends ZoneType
{
public NoRestartZone(final int id)
{
super(id);
}
@Override
protected void onEnter(Creature character)
{
if (character instanceof PlayerInstance)
{
character.setInsideZone(ZoneId.NO_RESTART, true);
}
}
@Override
protected void onExit(Creature character)
{
if (character instanceof PlayerInstance)
{
character.setInsideZone(ZoneId.NO_RESTART, false);
}
}
@Override
public void onDieInside(Creature character)
{
}
@Override
public void onReviveInside(Creature character)
{
}
}

View File

@@ -0,0 +1,56 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.model.zone.type;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
* A simple no summon zone
* @author JIV
*/
public class NoSummonFriendZone extends ZoneType
{
public NoSummonFriendZone(int id)
{
super(id);
}
@Override
protected void onEnter(Creature character)
{
character.setInsideZone(ZoneId.NO_SUMMON_FRIEND, true);
}
@Override
protected void onExit(Creature character)
{
character.setInsideZone(ZoneId.NO_SUMMON_FRIEND, false);
}
@Override
public void onDieInside(Creature character)
{
}
@Override
public void onReviveInside(Creature character)
{
}
}

View File

@@ -53,6 +53,8 @@ public class OlympiadStadiumZone extends ZoneType
public void onEnter(Creature creature)
{
creature.setInsideZone(ZoneId.PVP, true);
creature.setInsideZone(ZoneId.NO_RESTART, true);
creature.setInsideZone(ZoneId.NO_SUMMON_FRIEND, true);
if (creature instanceof PlayerInstance)
{
@@ -71,6 +73,8 @@ public class OlympiadStadiumZone extends ZoneType
public void onExit(Creature creature)
{
creature.setInsideZone(ZoneId.PVP, false);
creature.setInsideZone(ZoneId.NO_RESTART, false);
creature.setInsideZone(ZoneId.NO_SUMMON_FRIEND, false);
if (creature instanceof PlayerInstance)
{

View File

@@ -17,6 +17,7 @@
package org.l2jmobius.gameserver.model.zone.type;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
@@ -30,13 +31,15 @@ public class ScriptZone extends ZoneType
}
@Override
protected void onEnter(Creature creature)
protected void onEnter(Creature character)
{
character.setInsideZone(ZoneId.SCRIPT, true);
}
@Override
protected void onExit(Creature creature)
protected void onExit(Creature character)
{
character.setInsideZone(ZoneId.SCRIPT, false);
}
@Override

View File

@@ -16,38 +16,29 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
import java.util.ArrayList;
import java.util.List;
import org.w3c.dom.Node;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.SpawnZone;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
/**
* A Town zone
* @author durgus
*/
public class TownZone extends ZoneType
public class TownZone extends SpawnZone
{
private String _townName;
private int _townId;
private int _redirectTownId;
private int _taxById;
private boolean _noPeace;
private final List<Location> _spawnLoc;
public TownZone(int id)
{
super(id);
_taxById = 0;
_spawnLoc = new ArrayList<>();
// Default to Giran
_redirectTownId = 9;
@@ -85,12 +76,6 @@ public class TownZone extends ZoneType
}
}
@Override
public void setSpawnLocs(Node node)
{
_spawnLoc.add(new Location(Integer.parseInt(node.getAttributes().getNamedItem("X").getNodeValue()), Integer.parseInt(node.getAttributes().getNamedItem("Y").getNodeValue()), Integer.parseInt(node.getAttributes().getNamedItem("Z").getNodeValue())));
}
@Override
protected void onEnter(Creature creature)
{
@@ -106,6 +91,7 @@ public class TownZone extends ZoneType
creature.setInsideZone(ZoneId.PEACE, true);
}
creature.setInsideZone(ZoneId.TOWN, true);
}
@Override
@@ -115,6 +101,8 @@ public class TownZone extends ZoneType
{
creature.setInsideZone(ZoneId.PEACE, false);
}
creature.setInsideZone(ZoneId.TOWN, false);
}
@Override
@@ -155,15 +143,6 @@ public class TownZone extends ZoneType
return _redirectTownId;
}
/**
* Returns this zones spawn location
* @return
*/
public Location getSpawnLoc()
{
return _spawnLoc.get(Rnd.get(_spawnLoc.size()));
}
/**
* Returns this town zones castle id
* @return

View File

@@ -2096,10 +2096,23 @@ public enum SystemMessageId
PLAYING_FOR_LONG_TIME(764),
/**
* ID: 769 Message: A hacking tool has been discovered. Please try again after closing unnecessary programs.
* ID: 769<br>
* Message: A hacking tool has been discovered. Please try again after closing unnecessary programs.
*/
HACKING_TOOL(769),
/**
* ID: 778<br>
* Message: You may not log out from this location.
*/
NO_LOGOUT_HERE(778),
/**
* ID: 779<br>
* Message: You may not restart in this location.
*/
NO_RESTART_HERE(779),
/**
* ID: 780<br>
* Message: Observation is only possible during a siege.

View File

@@ -50,7 +50,6 @@ public class Action extends GameClientPacket
{
// Get the current PlayerInstance of the player
final PlayerInstance player = getClient().getPlayer();
if (player == null)
{
return;
@@ -64,7 +63,6 @@ public class Action extends GameClientPacket
}
final WorldObject obj;
if (player.getTargetId() == _objectId)
{
obj = player.getTarget();

View File

@@ -23,6 +23,7 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.entity.olympiad.Olympiad;
import org.l2jmobius.gameserver.model.entity.sevensigns.SevenSignsFestival;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -38,9 +39,8 @@ public class Logout extends GameClientPacket
@Override
protected void runImpl()
{
// Dont allow leaving if player is fighting
// Do not allow leaving if player is fighting
final PlayerInstance player = getClient().getPlayer();
if (player == null)
{
return;
@@ -53,7 +53,12 @@ public class Logout extends GameClientPacket
return;
}
player.getInventory().updateDatabase();
if (player.isInsideZone(ZoneId.NO_RESTART))
{
player.sendPacket(SystemMessageId.NO_LOGOUT_HERE);
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
if (AttackStanceTaskManager.getInstance().hasAttackStanceTask(player) && (!player.isGM() || !Config.GM_RESTART_FIGHTING))
{
@@ -62,7 +67,7 @@ public class Logout extends GameClientPacket
return;
}
// Dont allow leaving if player is in combat
// Do not allow leaving if player is in combat
if (player.isInCombat() && !player.isGM())
{
player.sendMessage("You cannot logout while in combat mode.");
@@ -70,7 +75,7 @@ public class Logout extends GameClientPacket
return;
}
// Dont allow leaving if player is teleporting
// Do not allow leaving if player is teleporting
if (player.isTeleporting() && !player.isGM())
{
player.sendMessage("You cannot logout while teleporting.");
@@ -107,6 +112,8 @@ public class Logout extends GameClientPacket
}
}
player.getInventory().updateDatabase();
if (player.isFlying())
{
player.removeSkill(SkillTable.getInstance().getInfo(4289, 1));

View File

@@ -16,7 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.gameserver.instancemanager.TownManager;
import org.l2jmobius.gameserver.datatables.xml.MapRegionData;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.partymatching.PartyMatchRoom;
@@ -82,8 +82,7 @@ public class RequestOustFromPartyRoom extends GameClientPacket
PartyMatchWaitingList.getInstance().addPlayer(member);
// Send Room list
final int loc = TownManager.getClosestLocation(member);
member.sendPacket(new PartyMatchList(member, 0, loc, member.getLevel()));
member.sendPacket(new PartyMatchList(member, 0, MapRegionData.getInstance().getClosestLocation(member.getX(), member.getY()), member.getLevel()));
// Clean player's LFP title
member.broadcastUserInfo();

View File

@@ -69,14 +69,14 @@ public class RequestRecipeShopListSet extends GameClientPacket
if (player.isTradeDisabled())
{
player.sendMessage("Private manufacture is disabled here. Try in another place.");
player.sendMessage("Private manufacture is disabled here. Try another place.");
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
if (player.isInsideZone(ZoneId.NO_STORE))
{
player.sendMessage("Private manufacture is disabled here. Try in another place.");
player.sendMessage("Private manufacture is disabled here. Try another place.");
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}

View File

@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.Party;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.entity.olympiad.Olympiad;
import org.l2jmobius.gameserver.model.entity.sevensigns.SevenSignsFestival;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.GameClient.GameClientState;
import org.l2jmobius.gameserver.network.SystemMessageId;
@@ -49,11 +50,8 @@ public class RequestRestart extends GameClientPacket
protected void runImpl()
{
final PlayerInstance player = getClient().getPlayer();
// Check if player is == null
if (player == null)
{
LOGGER.warning("[RequestRestart] activeChar null!?");
return;
}
@@ -64,6 +62,13 @@ public class RequestRestart extends GameClientPacket
return;
}
if (player.isInsideZone(ZoneId.NO_RESTART))
{
player.sendPacket(SystemMessageId.NO_RESTART_HERE);
sendPacket(RestartResponse.valueOf(false));
return;
}
// Check if player are changing class
if (player.isLocked())
{
@@ -72,8 +77,6 @@ public class RequestRestart extends GameClientPacket
return;
}
player.getInventory().updateDatabase();
// Check if player is in private store
if (player.getPrivateStoreType() != 0)
{
@@ -126,6 +129,8 @@ public class RequestRestart extends GameClientPacket
return;
}
player.getInventory().updateDatabase();
// Fix against exploit anti-target
if (player.isCastingNow())
{

View File

@@ -54,6 +54,40 @@ public class RequestRestartPoint extends GameClientPacket
_requestedPointType = readD();
}
@Override
protected void runImpl()
{
final PlayerInstance player = getClient().getPlayer();
if (player == null)
{
return;
}
if (player.isFakeDeath())
{
player.stopFakeDeath(null);
player.broadcastPacket(new Revive(player));
return;
}
else if (!player.isAlikeDead())
{
LOGGER.warning("Living player [" + player.getName() + "] called RestartPointPacket! Ban this player!");
return;
}
final Castle castle = CastleManager.getInstance().getCastle(player.getX(), player.getY(), player.getZ());
if ((castle != null) && castle.getSiege().isInProgress() && (player.getClan() != null) && castle.getSiege().checkIsAttacker(player.getClan()))
{
// Schedule respawn delay for attacker
ThreadPool.schedule(new DeathTask(player), castle.getSiege().getAttackerRespawnDelay());
player.sendMessage("You will be re-spawned in " + (castle.getSiege().getAttackerRespawnDelay() / 1000) + " seconds");
return;
}
// Run immediately (no need to schedule)
new DeathTask(player).run();
}
class DeathTask implements Runnable
{
PlayerInstance _player;
@@ -71,6 +105,7 @@ public class RequestRestartPoint extends GameClientPacket
_player.sendMessage("You cannot restart while participating in an event!");
return;
}
try
{
Location loc = null;
@@ -213,38 +248,4 @@ public class RequestRestartPoint extends GameClientPacket
}
}
}
@Override
protected void runImpl()
{
final PlayerInstance player = getClient().getPlayer();
if (player == null)
{
return;
}
if (player.isFakeDeath())
{
player.stopFakeDeath(null);
player.broadcastPacket(new Revive(player));
return;
}
else if (!player.isAlikeDead())
{
LOGGER.warning("Living player [" + player.getName() + "] called RestartPointPacket! Ban this player!");
return;
}
final Castle castle = CastleManager.getInstance().getCastle(player.getX(), player.getY(), player.getZ());
if ((castle != null) && castle.getSiege().isInProgress() && (player.getClan() != null) && castle.getSiege().checkIsAttacker(player.getClan()))
{
// Schedule respawn delay for attacker
ThreadPool.schedule(new DeathTask(player), castle.getSiege().getAttackerRespawnDelay());
player.sendMessage("You will be re-spawned in " + (castle.getSiege().getAttackerRespawnDelay() / 1000) + " seconds");
return;
}
// run immediately (no need to schedule)
new DeathTask(player).run();
}
}

View File

@@ -99,7 +99,7 @@ public class SetPrivateStoreListBuy extends GameClientPacket
if (player.isInsideZone(ZoneId.NO_STORE))
{
player.sendPacket(new PrivateStoreManageListBuy(player));
player.sendMessage("Trade are disable here. Try in another place.");
player.sendMessage("Trade is disable here. Try another place.");
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}

View File

@@ -99,7 +99,7 @@ public class SetPrivateStoreListSell extends GameClientPacket
if (player.isInsideZone(ZoneId.NO_STORE))
{
player.sendPacket(new PrivateStoreManageListSell(player));
player.sendMessage("Trade are disable here. Try in another place.");
player.sendMessage("Trade is disable here. Try another place.");
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}

View File

@@ -16,7 +16,7 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.gameserver.instancemanager.TownManager;
import org.l2jmobius.gameserver.datatables.xml.MapRegionData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.partymatching.PartyMatchRoom;
@@ -46,7 +46,7 @@ public class ExManagePartyRoomMember extends GameServerPacket
writeS(_player.getName());
writeD(_player.getActiveClass());
writeD(_player.getLevel());
writeD(TownManager.getClosestLocation(_player));
writeD(MapRegionData.getInstance().getClosestLocation(_player.getX(), _player.getY()));
if (_room.getOwner().equals(_player))
{
writeD(1);

View File

@@ -16,7 +16,7 @@
*/
package org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.gameserver.instancemanager.TownManager;
import org.l2jmobius.gameserver.datatables.xml.MapRegionData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.partymatching.PartyMatchRoom;
@@ -41,18 +41,18 @@ public class ExPartyRoomMember extends GameServerPacket
writeH(0x0e);
writeD(_mode);
writeD(_room.getMembers());
for (PlayerInstance _member : _room.getPartyMembers())
for (PlayerInstance member : _room.getPartyMembers())
{
writeD(_member.getObjectId());
writeS(_member.getName());
writeD(_member.getActiveClass());
writeD(_member.getLevel());
writeD(TownManager.getClosestLocation(_member));
if (_room.getOwner().equals(_member))
writeD(member.getObjectId());
writeS(member.getName());
writeD(member.getActiveClass());
writeD(member.getLevel());
writeD(MapRegionData.getInstance().getClosestLocation(member.getX(), member.getY()));
if (_room.getOwner().equals(member))
{
writeD(1);
}
else if ((_room.getOwner().isInParty() && _member.isInParty()) && (_room.getOwner().getParty().getPartyLeaderOID() == _member.getParty().getPartyLeaderOID()))
else if ((_room.getOwner().isInParty() && member.isInParty()) && (_room.getOwner().getParty().getPartyLeaderOID() == member.getParty().getPartyLeaderOID()))
{
writeD(2);
}

View File

@@ -758,8 +758,8 @@ public class GameStatusThread extends Thread
}
else if (type.equals("zone"))
{
_print.print("Reloading zone tables... ");
ZoneData.getInstance().load();
_print.print("Reloading zones... ");
ZoneData.getInstance().reload();
_print.println("done");
}
else if (type.equals("teleports"))