/*
* 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 .
*/
package com.l2jserver.gameserver.datatables;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.l2jserver.Config;
import com.l2jserver.L2DatabaseFactory;
import com.l2jserver.gameserver.SevenSigns;
import com.l2jserver.gameserver.instancemanager.CastleManager;
import com.l2jserver.gameserver.instancemanager.ClanHallManager;
import com.l2jserver.gameserver.instancemanager.FortManager;
import com.l2jserver.gameserver.instancemanager.InstanceManager;
import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
import com.l2jserver.gameserver.instancemanager.TownManager;
import com.l2jserver.gameserver.instancemanager.ZoneManager;
import com.l2jserver.gameserver.model.Location;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.actor.instance.L2SiegeFlagInstance;
import com.l2jserver.gameserver.model.entity.Castle;
import com.l2jserver.gameserver.model.entity.ClanHall;
import com.l2jserver.gameserver.model.entity.Fort;
import com.l2jserver.gameserver.model.entity.Instance;
import com.l2jserver.gameserver.model.zone.type.L2ArenaZone;
import com.l2jserver.gameserver.model.zone.type.L2ClanHallZone;
/**
* This class ...
*/
public class MapRegionTable
{
private static Logger _log = Logger.getLogger(MapRegionTable.class.getName());
private final int[][] _regions = new int[16][18];
public static enum TeleportWhereType
{
Castle,
ClanHall,
SiegeFlag,
Town,
Fortress
}
public static MapRegionTable getInstance()
{
return SingletonHolder._instance;
}
private MapRegionTable()
{
int count2 = 0;
//LineNumberReader lnr = null;
Connection con = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement("SELECT region, sec0, sec1, sec2, sec3, sec4, sec5, sec6, sec7, sec8, sec9, sec10,sec11,sec12,sec13,sec14,sec15 FROM mapregion");
ResultSet rset = statement.executeQuery();
int region;
while (rset.next())
{
region = rset.getInt(1);
for (int j = 0; j < 16; j++)
{
_regions[j][region] = rset.getInt(j + 2);
count2++;
//_log.fine(j+","+region+" -> "+rset.getInt(j+2));
}
}
rset.close();
statement.close();
if (Config.DEBUG)
_log.fine(count2 + " mapregion loaded");
}
catch (Exception e)
{
_log.log(Level.SEVERE, "Error loading Map Region Table.", e);
}
finally
{
L2DatabaseFactory.close(con);
}
}
public final int getMapRegion(int posX, int posY)
{
try
{
return _regions[getMapRegionX(posX)][getMapRegionY(posY)];
}
catch (ArrayIndexOutOfBoundsException e)
{
// Position sent is outside MapRegionTable area.
if (Config.DEBUG)
_log.log(Level.WARNING, "MapRegionTable: Player outside map regions at X,Y=" + posX + "," + posY, e);
return 0;
}
}
public final int getMapRegionX(int posX)
{
return (posX >> 15) + 9;// + centerTileX;
}
public final int getMapRegionY(int posY)
{
return (posY >> 15) + 10;// + centerTileX;
}
public int getAreaCastle(L2Character activeChar)
{
int area = getClosestTownNumber(activeChar);
int castle;
switch (area)
{
case 0:
castle = 1;
break;//Talking Island Village
case 1:
castle = 4;
break; //Elven Village
case 2:
castle = 4;
break; //Dark Elven Village
case 3:
castle = 9;
break; //Orc Village
case 4:
castle = 9;
break; //Dwarven Village
case 5:
castle = 1;
break; //Town of Gludio
case 6:
castle = 1;
break; //Gludin Village
case 7:
castle = 2;
break; //Town of Dion
case 8:
castle = 3;
break; //Town of Giran
case 9:
castle = 4;
break; //Town of Oren
case 10:
castle = 5;
break; //Town of Aden
case 11:
castle = 5;
break; //Hunters Village
case 12:
castle = 3;
break; //Giran Harbor
case 13:
castle = 6;
break; //Heine
case 14:
castle = 8;
break; //Rune Township
case 15:
castle = 7;
break; //Town of Goddard
case 16:
castle = 9;
break; //Town of Shuttgart
case 17:
castle = 2;
break; //Floran Village
case 18:
castle = 8;
break; //Primeval Isle Wharf
case 19:
castle = 5;
break; //Kamael Village
case 20:
castle = 6;
break; //South of Wastelands Camp
case 21:
castle = 8;
break; //Fantasy Island
default:
castle = 5;
break; //Town of Aden
}
return castle;
}
public int getClosestTownNumber(L2Character activeChar)
{
return getMapRegion(activeChar.getX(), activeChar.getY());
}
/**
* Get town name by character position
* @param activeChar
* @return String
*/
public String getClosestTownName(L2Character activeChar)
{
return getClosestTownName(getMapRegion(activeChar.getX(), activeChar.getY()));
}
/**
* Get town name by town id
* @param townId
* @return String
*/
public String getClosestTownName(int townId)
{
String nearestTown = null;
switch (townId)
{
case 0:
nearestTown = "Talking Island Village";
break;
case 1:
nearestTown = "Elven Village";
break;
case 2:
nearestTown = "Dark Elven Village";
break;
case 3:
nearestTown = "Orc Village";
break;
case 4:
nearestTown = "Dwarven Village";
break;
case 5:
nearestTown = "Town of Gludio";
break;
case 6:
nearestTown = "Gludin Village";
break;
case 7:
nearestTown = "Town of Dion";
break;
case 8:
nearestTown = "Town of Giran";
break;
case 9:
nearestTown = "Town of Oren";
break;
case 10:
nearestTown = "Town of Aden";
break;
case 11:
nearestTown = "Hunters Village";
break;
case 12:
nearestTown = "Giran Harbor";
break;
case 13:
nearestTown = "Heine";
break;
case 14:
nearestTown = "Rune Township";
break;
case 15:
nearestTown = "Town of Goddard";
break;
case 16:
nearestTown = "Town of Schuttgart";
break;
case 18:
nearestTown = "Primeval Isle";
break;
case 19:
nearestTown = "Kamael Village";
break;
case 20:
nearestTown = "South of Wastelands Camp";
break;
case 21:
nearestTown = "Fantasy Island";
break;
case 22:
nearestTown = "Neutral Zone";
break;
case 23:
nearestTown = "Coliseum";
break;
case 24:
nearestTown = "GM Consultation service";
break;
case 25:
nearestTown = "Dimensional Gap";
break;
case 26:
nearestTown = "Cemetary of the Empire";
break;
case 27:
nearestTown = "Inside the Steel Citadel";
break;
case 28:
nearestTown = "Steel Citadel Resistance";
break;
case 29:
nearestTown = "Inside Kamaloka";
break;
case 30:
nearestTown = "Inside Nia Kamaloka";
break;
case 31:
nearestTown = "Inside Rim Kamaloka";
break;
case 32:
nearestTown = "Keucereus clan association";
break;
case 33:
nearestTown = "Inside the Seed of Infinity";
break;
case 34:
nearestTown = "Outside the Seed of Infinity";
break;
case 35:
nearestTown = "Aerial Cleft";
break;
default:
nearestTown = "Town of Aden";
break;
}
return nearestTown;
}
public Location getTeleToLocation(L2Character activeChar, TeleportWhereType teleportWhere)
{
int[] coord;
if (activeChar instanceof L2PcInstance)
{
L2PcInstance player = ((L2PcInstance) activeChar);
// If in Monster Derby Track
if (player.isInsideZone(L2Character.ZONE_MONSTERTRACK))
return new Location(12661, 181687, -3560);
Castle castle = null;
Fort fort = null;
ClanHall clanhall = null;
if (player.getClan() != null
&& !player.isFlyingMounted()
&& !player.isFlying()) // flying players in gracia cant use teleports to aden continent
{
// If teleport to clan hall
if (teleportWhere == TeleportWhereType.ClanHall)
{
clanhall = ClanHallManager.getInstance().getClanHallByOwner(player.getClan());
if (clanhall != null)
{
L2ClanHallZone zone = clanhall.getZone();
if (zone != null && !player.isFlyingMounted())
return zone.getSpawnLoc();
}
}
// If teleport to castle
if (teleportWhere == TeleportWhereType.Castle)
{
castle = CastleManager.getInstance().getCastleByOwner(player.getClan());
// Otherwise check if player is on castle or fortress ground
// and player's clan is defender
if (castle == null)
{
castle = CastleManager.getInstance().getCastle(player);
if (!(castle != null && castle.getSiege().getIsInProgress() && castle.getSiege().getDefenderClan(player.getClan()) != null))
castle = null;
}
if (castle != null && castle.getCastleId() > 0)
return castle.getCastleZone().getSpawnLoc();
}
// If teleport to fortress
if (teleportWhere == TeleportWhereType.Fortress)
{
fort = FortManager.getInstance().getFortByOwner(player.getClan());
// Otherwise check if player is on castle or fortress ground
// and player's clan is defender
if (fort == null)
{
fort = FortManager.getInstance().getFort(player);
if (!(fort != null && fort.getSiege().getIsInProgress() && fort.getOwnerClan() == player.getClan()))
fort = null;
}
if (fort != null && fort.getFortId() > 0)
return fort.getFortZone().getSpawnLoc();
}
// If teleport to SiegeHQ
if (teleportWhere == TeleportWhereType.SiegeFlag)
{
castle = CastleManager.getInstance().getCastle(player);
fort = FortManager.getInstance().getFort(player);
L2SiegeFlagInstance tw_flag = TerritoryWarManager.getInstance().getFlagForClan(player.getClan());
if (tw_flag != null)
return new Location(tw_flag.getX(), tw_flag.getY(), tw_flag.getZ());
else if (castle != null)
{
if (castle.getSiege().getIsInProgress())
{
// Check if player's clan is attacker
List flags = castle.getSiege().getFlag(player.getClan());
if (flags != null && !flags.isEmpty())
{
// Spawn to flag - Need more work to get player to the nearest flag
L2Npc flag = flags.get(0);
return new Location(flag.getX(), flag.getY(), flag.getZ());
}
}
}
else if (fort != null)
{
if (fort.getSiege().getIsInProgress())
{
// Check if player's clan is attacker
List flags = fort.getSiege().getFlag(player.getClan());
if (flags != null && !flags.isEmpty())
{
// Spawn to flag - Need more work to get player to the nearest flag
L2Npc flag = flags.get(0);
return new Location(flag.getX(), flag.getY(), flag.getZ());
}
}
}
}
}
//Karma player land out of city
if (player.getKarma() > 0)
{
try
{
return TownManager.getClosestTown(activeChar).getChaoticSpawnLoc();
}
catch (Exception e)
{
if (player.isFlyingMounted()) // prevent flying players to teleport outside of gracia
return new Location(-186330, 242944, 2544);
else
return new Location(17817, 170079, -3530);
}
}
// Checking if in arena
L2ArenaZone arena = ZoneManager.getInstance().getArena(player);
if (arena != null)
return arena.getSpawnLoc();
//Checking if needed to be respawned in "far" town from the castle;
castle = CastleManager.getInstance().getCastle(player);
if (castle != null)
{
if (castle.getSiege().getIsInProgress())
{
// Check if player's clan is participating
if ((castle.getSiege().checkIsDefender(player.getClan()) || castle.getSiege().checkIsAttacker(player.getClan()))
&& SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) == SevenSigns.CABAL_DAWN)
return TownManager.getSecondClosestTown(activeChar).getSpawnLoc();
}
}
// Checking if in an instance
if (player.getInstanceId() > 0)
{
Instance inst = InstanceManager.getInstance().getInstance(player.getInstanceId());
if (inst != null)
{
coord = inst.getSpawnLoc();
if (coord[0] != 0 && coord[1] != 0 && coord[2] != 0)
return new Location(coord[0], coord[1], coord[2]);
}
}
}
// Get the nearest town
try
{
return TownManager.getClosestTown(activeChar).getSpawnLoc();
}
catch (NullPointerException e)
{
// port to the Talking Island if no closest town found
return new Location(-84176, 243382, -3126);
}
}
@SuppressWarnings("synthetic-access")
private static class SingletonHolder
{
protected static final MapRegionTable _instance = new MapRegionTable();
}
}