/*
* 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 net.sf.l2j.gameserver.instancemanager;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.logging.Logger;
import javolution.util.FastList;
import javolution.util.FastMap;
import net.sf.l2j.Config;
import net.sf.l2j.L2DatabaseFactory;
import net.sf.l2j.gameserver.datatables.SkillTable;
import net.sf.l2j.gameserver.model.CombatFlag;
import net.sf.l2j.gameserver.model.L2Character;
import net.sf.l2j.gameserver.model.L2Clan;
import net.sf.l2j.gameserver.model.L2ItemInstance;
import net.sf.l2j.gameserver.model.L2Object;
import net.sf.l2j.gameserver.model.Location;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.entity.Fort;
import net.sf.l2j.gameserver.model.entity.FortSiege;
public class FortSiegeManager
{
private static final Logger _log = Logger.getLogger(FortSiegeManager.class.getName());
// =========================================================
private static FortSiegeManager _instance;
public static final FortSiegeManager getInstance()
{
if (_instance == null)
{
_log.info("Initializing SiegeManager");
_instance = new FortSiegeManager();
_instance.load();
}
return _instance;
}
// =========================================================
// Data Field
private int _attackerMaxClans = 500; // Max number of clans
private int _attackerRespawnDelay = 20000; // Time in ms. Changeable in siege.config
private int _defenderMaxClans = 500; // Max number of clans
private int _defenderRespawnDelay = 10000; // Time in ms. Changeable in siege.config
// Fort Siege settings
private FastMap> _commanderSpawnList;
private FastMap> _flagList;
private int _controlTowerLosePenalty = 20000; // Time in ms. Changeable in siege.config
private int _flagMaxCount = 1; // Changeable in siege.config
private int _siegeClanMinLevel = 4; // Changeable in siege.config
private int _siegeLength = 120; // Time in minute. Changeable in siege.config
private List _sieges;
// =========================================================
// Constructor
private FortSiegeManager()
{
}
// =========================================================
// Method - Public
public final void addSiegeSkills(L2PcInstance character)
{
character.addSkill(SkillTable.getInstance().getInfo(246, 1), false);
character.addSkill(SkillTable.getInstance().getInfo(247, 1), false);
}
/**
* Return true if character summon
* @param activeChar The L2Character of the character can summon
*/
public final boolean checkIfOkToSummon(L2Character activeChar, boolean isCheckOnly)
{
if (!(activeChar instanceof L2PcInstance)) return false;
String text = "";
L2PcInstance player = (L2PcInstance)activeChar;
Fort fort = FortManager.getInstance().getFort(player);
if (fort == null || fort.getFortId() <= 0)
text = "You must be on fort ground to summon this";
else if (!fort.getSiege().getIsInProgress())
text = "You can only summon this during a siege.";
else if (player.getClanId() != 0 && fort.getSiege().getAttackerClan(player.getClanId()) == null)
text = "You can only summon this as a registered attacker.";
else
return true;
if (!isCheckOnly)
player.sendMessage(text);
return false;
}
/**
* Return true if the clan is registered or owner of a fort
* @param clan The L2Clan of the player
*/
public final boolean checkIsRegistered(L2Clan clan, int fortid)
{
if (clan == null) return false;
java.sql.Connection con = null;
boolean register = false;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement("SELECT clan_id FROM fortsiege_clans where clan_id=? and fort_id=?");
statement.setInt(1, clan.getClanId());
statement.setInt(2, fortid);
ResultSet rs = statement.executeQuery();
while (rs.next())
{
register = true;
break;
}
rs.close();
statement.close();
}
catch (Exception e)
{
_log.warning("Exception: checkIsRegistered(): " + e.getMessage());
e.printStackTrace();
}
finally
{
try { con.close(); } catch (Exception e) {}
}
return register;
}
public final void removeSiegeSkills(L2PcInstance character)
{
character.removeSkill(SkillTable.getInstance().getInfo(246, 1));
character.removeSkill(SkillTable.getInstance().getInfo(247, 1));
}
// =========================================================
// Method - Private
private final void load()
{
try {
InputStream is = new FileInputStream(new File(Config.FORTSIEGE_CONFIGURATION_FILE));
Properties siegeSettings = new Properties();
siegeSettings.load(is);
is.close();
// Siege setting
_attackerMaxClans = Integer.decode(siegeSettings.getProperty("AttackerMaxClans", "500"));
_attackerRespawnDelay = Integer.decode(siegeSettings.getProperty("AttackerRespawn", "30000"));
_controlTowerLosePenalty = Integer.decode(siegeSettings.getProperty("CTLossPenalty", "20000"));
_defenderMaxClans = Integer.decode(siegeSettings.getProperty("DefenderMaxClans", "500"));
_defenderRespawnDelay = Integer.decode(siegeSettings.getProperty("DefenderRespawn", "20000"));
_flagMaxCount = Integer.decode(siegeSettings.getProperty("MaxFlags", "1"));
_siegeClanMinLevel = Integer.decode(siegeSettings.getProperty("SiegeClanMinLevel", "4"));
_siegeLength = Integer.decode(siegeSettings.getProperty("SiegeLength", "120"));
// Siege spawns settings
_commanderSpawnList = new FastMap>();
_flagList = new FastMap>();
for (Fort fort: FortManager.getInstance().getForts())
{
FastList _commanderSpawns = new FastList();
FastList _flagSpawns = new FastList();
for (int i=1; i<5; i++)
{
String _spawnParams = siegeSettings.getProperty(fort.getName() + "Commander" + Integer.toString(i), "");
if (_spawnParams.length() == 0) break;
StringTokenizer st = new StringTokenizer(_spawnParams.trim(), ",");
try
{
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int z = Integer.parseInt(st.nextToken());
int heading = Integer.parseInt(st.nextToken());
int npc_id = Integer.parseInt(st.nextToken());
_commanderSpawns.add(new SiegeSpawn(fort.getFortId(),x,y,z,heading,npc_id));
}
catch (Exception e)
{
_log.warning("Error while loading commander(s) for "+fort.getName()+" fort.");
}
}
_commanderSpawnList.put(fort.getFortId(), _commanderSpawns);
for (int i=1; i<4; i++)
{
String _spawnParams = siegeSettings.getProperty(fort.getName() + "Flag" + Integer.toString(i), "");
if (_spawnParams.length() == 0) break;
StringTokenizer st = new StringTokenizer(_spawnParams.trim(), ",");
try
{
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int z = Integer.parseInt(st.nextToken());
int flag_id = Integer.parseInt(st.nextToken());
_flagSpawns.add(new CombatFlag(fort.getFortId(),x,y,z,0,flag_id));
}
catch (Exception e)
{
_log.warning("Error while loading flag(s) for "+fort.getName()+" fort.");
}
}
_flagList.put(fort.getFortId(), _flagSpawns);
}
} catch (Exception e) {
//_initialized = false;
System.err.println("Error while loading fortsiege data.");
e.printStackTrace();
}
}
// =========================================================
// Property - Public
public final FastList getCommanderSpawnList(int _fortId)
{
if (_commanderSpawnList.containsKey(_fortId))
return _commanderSpawnList.get(_fortId);
else
return null;
}
public final FastList getFlagList(int _fortId)
{
if (_flagList.containsKey(_fortId))
return _flagList.get(_fortId);
else
return null;
}
public final int getAttackerMaxClans() { return _attackerMaxClans; }
public final int getAttackerRespawnDelay() { return _attackerRespawnDelay; }
public final int getControlTowerLosePenalty() { return _controlTowerLosePenalty; }
public final int getDefenderMaxClans() { return _defenderMaxClans; }
public final int getDefenderRespawnDelay() { return (_defenderRespawnDelay); }
public final int getFlagMaxCount() { return _flagMaxCount; }
public final FortSiege getSiege(L2Object activeObject) { return getSiege(activeObject.getX(), activeObject.getY(), activeObject.getZ()); }
public final FortSiege getSiege(int x, int y, int z)
{
for (Fort fort: FortManager.getInstance().getForts())
if (fort.getSiege().checkIfInZone(x, y, z)) return fort.getSiege();
return null;
}
public final int getSiegeClanMinLevel() { return _siegeClanMinLevel; }
public final int getSiegeLength() { return _siegeLength; }
public final List getSieges()
{
if (_sieges == null)
_sieges = new FastList();
return _sieges;
}
public final void addSiege(FortSiege fortSiege)
{
if (_sieges == null)
_sieges = new FastList();
_sieges.add(fortSiege);
}
public boolean isCombat(int itemId)
{
return ( itemId == 9819);
}
public void activateCombatFlag(L2PcInstance player, L2ItemInstance item)
{
if (!checkIfCanPickup(player))
return;
Fort fort = FortManager.getInstance().getFort(player);
FastList fcf = _flagList.get(fort.getFortId());
for ( CombatFlag cf : fcf)
{
if ( cf.itemInstance == item)
{
cf.activate(player, item);
}
}
}
public boolean checkIfCanPickup(L2PcInstance player)
{
// Cannot own 2 combat flag
if (player.isCombatFlagEquipped())
{
player.sendMessage("You already have the combat flag");
return false;
}
// here check if is siege is in progress
// here check if is siege is attacker
Fort fort = FortManager.getInstance().getFort(player);
if (fort == null || fort.getFortId() <= 0)
{
player.sendMessage("You must be on fort ground to pickup Combat Flag");
return false;
}
else if (!fort.getSiege().getIsInProgress())
{
player.sendMessage("You can only pickup Combat Flag during a siege.");
return false;
}
else if (fort.getSiege().getAttackerClan(player.getClan()) == null)
{
player.sendMessage("You must be an attacker to pickup Combat Flag");
return false;
}
return true;
}
public void dropCombatFlag(L2PcInstance player)
{
System.out.println("Player obj " + player.getObjectId());
Fort fort = FortManager.getInstance().getFort(player);
System.out.println("Fort " + fort.getName());
FastList fcf = _flagList.get(fort.getFortId());
System.out.println("fast list size " + fcf.size());
for ( CombatFlag cf : fcf)
{
if ( cf.playerId == player.getObjectId())
{
System.out.println("found cf ");
cf.dropIt();
cf.spawnMe();
}
}
}
public class SiegeSpawn
{
Location _location;
private int _npcId;
private int _heading;
private int _fortId;
private int _hp;
public SiegeSpawn(int fort_id, int x, int y, int z, int heading, int npc_id)
{
_fortId = fort_id;
_location = new Location(x,y,z,heading);
_heading = heading;
_npcId = npc_id;
}
public SiegeSpawn(int fort_id, int x, int y, int z, int heading, int npc_id, int hp)
{
_fortId = fort_id;
_location = new Location(x,y,z,heading);
_heading = heading;
_npcId = npc_id;
_hp = hp;
}
public int getFortId()
{
return _fortId;
}
public int getNpcId()
{
return _npcId;
}
public int getHeading()
{
return _heading;
}
public int getHp()
{
return _hp;
}
public Location getLocation()
{
return _location;
}
}
}