/*
* 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 .
*/
/**
* @author godson
*/
package com.l2jserver.gameserver.model.entity;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import com.l2jserver.Config;
import com.l2jserver.L2DatabaseFactory;
import com.l2jserver.gameserver.datatables.ClanTable;
import com.l2jserver.gameserver.model.L2Clan;
import com.l2jserver.gameserver.model.L2ItemInstance;
import com.l2jserver.gameserver.model.L2World;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
import com.l2jserver.gameserver.model.olympiad.Olympiad;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;
import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
import com.l2jserver.gameserver.network.serverpackets.UserInfo;
import com.l2jserver.gameserver.templates.StatsSet;
import javolution.util.FastMap;
public class Hero
{
private static Logger _log = Logger.getLogger(Hero.class.getName());
private static final String GET_HEROES = "SELECT heroes.charId, "
+ "characters.char_name, heroes.class_id, heroes.count, heroes.played "
+"FROM heroes, characters WHERE characters.charId = heroes.charId "
+"AND heroes.played = 1";
private static final String GET_ALL_HEROES = "SELECT heroes.charId, "
+ "characters.char_name, heroes.class_id, heroes.count, heroes.played "
+"FROM heroes, characters WHERE characters.charId = heroes.charId";
private static final String UPDATE_ALL = "UPDATE heroes SET played = 0";
private static final String INSERT_HERO = "INSERT INTO heroes VALUES (?,?,?,?)";
private static final String UPDATE_HERO = "UPDATE heroes SET count = ?, "
+"played = ?" + " WHERE charId = ?";
private static final String GET_CLAN_ALLY = "SELECT characters.clanid "
+"AS clanid, coalesce(clan_data.ally_Id, 0) AS allyId FROM characters "
+"LEFT JOIN clan_data ON clan_data.clan_id = characters.clanid "
+"WHERE characters.charId = ?";
private static final String GET_CLAN_NAME = "SELECT clan_name FROM clan_data "
+"WHERE clan_id = (SELECT clanid FROM characters WHERE char_name = ?)";
// delete hero items
private static final String DELETE_ITEMS = "DELETE FROM items WHERE item_id IN "
+ "(6842, 6611, 6612, 6613, 6614, 6615, 6616, 6617, 6618, 6619, 6620, 6621, 9388, 9389, 9390) "
+ "AND owner_id NOT IN (SELECT charId FROM characters WHERE accesslevel > 0)";
private static Map _heroes;
private static Map _completeHeroes;
public static final String COUNT = "count";
public static final String PLAYED = "played";
public static final String CLAN_NAME = "clan_name";
public static final String CLAN_CREST = "clan_crest";
public static final String ALLY_NAME = "ally_name";
public static final String ALLY_CREST = "ally_crest";
public static Hero getInstance()
{
return SingletonHolder._instance;
}
private Hero()
{
init();
}
private void init()
{
_heroes = new FastMap();
_completeHeroes = new FastMap();
Connection con = null;
Connection con2 = null;
PreparedStatement statement;
PreparedStatement statement2;
ResultSet rset;
ResultSet rset2;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
con2 = L2DatabaseFactory.getInstance().getConnection();
statement = con.prepareStatement(GET_HEROES);
rset = statement.executeQuery();
while (rset.next())
{
StatsSet hero = new StatsSet();
int charId = rset.getInt(Olympiad.CHAR_ID);
hero.set(Olympiad.CHAR_NAME, rset.getString(Olympiad.CHAR_NAME));
hero.set(Olympiad.CLASS_ID, rset.getInt(Olympiad.CLASS_ID));
hero.set(COUNT, rset.getInt(COUNT));
hero.set(PLAYED, rset.getInt(PLAYED));
statement2 = con2.prepareStatement(GET_CLAN_ALLY);
statement2.setInt(1, charId);
rset2 = statement2.executeQuery();
if (rset2.next())
{
int clanId = rset2.getInt("clanid");
int allyId = rset2.getInt("allyId");
String clanName = "";
String allyName = "";
int clanCrest = 0;
int allyCrest = 0;
if (clanId > 0)
{
clanName = ClanTable.getInstance().getClan(clanId).getName();
clanCrest = ClanTable.getInstance().getClan(clanId).getCrestId();
if (allyId > 0)
{
allyName = ClanTable.getInstance().getClan(clanId).getAllyName();
allyCrest = ClanTable.getInstance().getClan(clanId).getAllyCrestId();
}
}
hero.set(CLAN_CREST, clanCrest);
hero.set(CLAN_NAME, clanName);
hero.set(ALLY_CREST, allyCrest);
hero.set(ALLY_NAME, allyName);
}
rset2.close();
statement2.close();
_heroes.put(charId, hero);
}
rset.close();
statement.close();
statement = con.prepareStatement(GET_ALL_HEROES);
rset = statement.executeQuery();
while (rset.next())
{
StatsSet hero = new StatsSet();
int charId = rset.getInt(Olympiad.CHAR_ID);
hero.set(Olympiad.CHAR_NAME, rset.getString(Olympiad.CHAR_NAME));
hero.set(Olympiad.CLASS_ID, rset.getInt(Olympiad.CLASS_ID));
hero.set(COUNT, rset.getInt(COUNT));
hero.set(PLAYED, rset.getInt(PLAYED));
statement2 = con2.prepareStatement(GET_CLAN_ALLY);
statement2.setInt(1, charId);
rset2 = statement2.executeQuery();
if (rset2.next())
{
int clanId = rset2.getInt("clanid");
int allyId = rset2.getInt("allyId");
String clanName = "";
String allyName = "";
int clanCrest = 0;
int allyCrest = 0;
if (clanId > 0)
{
clanName = ClanTable.getInstance().getClan(clanId).getName();
clanCrest = ClanTable.getInstance().getClan(clanId).getCrestId();
if (allyId > 0)
{
allyName = ClanTable.getInstance().getClan(clanId).getAllyName();
allyCrest = ClanTable.getInstance().getClan(clanId).getAllyCrestId();
}
}
hero.set(CLAN_CREST, clanCrest);
hero.set(CLAN_NAME, clanName);
hero.set(ALLY_CREST, allyCrest);
hero.set(ALLY_NAME, allyName);
}
rset2.close();
statement2.close();
_completeHeroes.put(charId, hero);
}
rset.close();
statement.close();
}
catch (SQLException e)
{
_log.warning("Hero System: Couldnt load Heroes");
if (Config.DEBUG)
e.printStackTrace();
}
finally
{
try
{
con.close();
con2.close();
}
catch (Exception e)
{
}
}
_log.info("Hero System: Loaded " + _heroes.size() + " Heroes.");
_log.info("Hero System: Loaded " + _completeHeroes.size() + " all time Heroes.");
}
public Map getHeroes()
{
return _heroes;
}
public synchronized void computeNewHeroes(List newHeroes)
{
updateHeroes(true);
if (!_heroes.isEmpty())
{
for (StatsSet hero : _heroes.values())
{
String name = hero.getString(Olympiad.CHAR_NAME);
L2PcInstance player = L2World.getInstance().getPlayer(name);
if (player == null)
continue;
try
{
player.setHero(false);
for (int i = 0; i < Inventory.PAPERDOLL_TOTALSLOTS; i++)
{
L2ItemInstance equippedItem = player.getInventory().getPaperdollItem(i);
if (equippedItem != null && equippedItem.isHeroItem())
player.getInventory().unEquipItemInSlotAndRecord(i);
}
for (L2ItemInstance item : player.getInventory().getAvailableItems(false, false))
{
if (item != null && item.isHeroItem())
{
player.destroyItem("Hero", item, null, true);
InventoryUpdate iu = new InventoryUpdate();
iu.addRemovedItem(item);
player.sendPacket(iu);
}
}
player.broadcastUserInfo();
}
catch (NullPointerException e)
{
}
}
}
if (newHeroes.isEmpty())
{
_heroes.clear();
return;
}
Map heroes = new FastMap();
for (StatsSet hero : newHeroes)
{
int charId = hero.getInteger(Olympiad.CHAR_ID);
if (_completeHeroes != null && _completeHeroes.containsKey(charId))
{
StatsSet oldHero = _completeHeroes.get(charId);
int count = oldHero.getInteger(COUNT);
oldHero.set(COUNT, count + 1);
oldHero.set(PLAYED, 1);
heroes.put(charId, oldHero);
}
else
{
StatsSet newHero = new StatsSet();
newHero.set(Olympiad.CHAR_NAME, hero.getString(Olympiad.CHAR_NAME));
newHero.set(Olympiad.CLASS_ID, hero.getInteger(Olympiad.CLASS_ID));
newHero.set(COUNT, 1);
newHero.set(PLAYED, 1);
heroes.put(charId, newHero);
}
}
deleteItemsInDb();
_heroes.clear();
_heroes.putAll(heroes);
heroes.clear();
updateHeroes(false);
for (StatsSet hero : _heroes.values())
{
String name = hero.getString(Olympiad.CHAR_NAME);
L2PcInstance player = L2World.getInstance().getPlayer(name);
if (player != null)
{
player.setHero(true);
L2Clan clan = player.getClan();
if (clan != null)
{
clan.addReputationScore(Config.HERO_POINTS, true);
SystemMessage sm = new SystemMessage(SystemMessageId.CLAN_MEMBER_C1_BECAME_HERO_AND_GAINED_S2_REPUTATION_POINTS);
sm.addString(name);
sm.addNumber(Config.HERO_POINTS);
clan.broadcastToOnlineMembers(sm);
}
player.sendPacket(new UserInfo(player));
player.sendPacket(new ExBrExtraUserInfo(player));
player.broadcastUserInfo();
}
else
{
Connection con = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(GET_CLAN_NAME);
statement.setString(1, name);
ResultSet rset = statement.executeQuery();
if (rset.next())
{
String clanName = rset.getString("clan_name");
if (clanName != null)
{
L2Clan clan = ClanTable.getInstance().getClanByName(clanName);
if (clan != null)
{
clan.addReputationScore(Config.HERO_POINTS, true);
SystemMessage sm = new SystemMessage(SystemMessageId.CLAN_MEMBER_C1_BECAME_HERO_AND_GAINED_S2_REPUTATION_POINTS);
sm.addString(name);
sm.addNumber(Config.HERO_POINTS);
clan.broadcastToOnlineMembers(sm);
}
}
}
rset.close();
statement.close();
}
catch (Exception e)
{
_log.warning("could not get clan name of " + name + ": " + e);
}
finally
{
try
{
con.close();
}
catch (Exception e)
{
}
}
}
}
}
public void updateHeroes(boolean setDefault)
{
Connection con = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
if (setDefault)
{
PreparedStatement statement = con.prepareStatement(UPDATE_ALL);
statement.execute();
statement.close();
}
else
{
PreparedStatement statement;
for (Integer heroId : _heroes.keySet())
{
StatsSet hero = _heroes.get(heroId);
if (_completeHeroes == null || !_completeHeroes.containsKey(heroId))
{
statement = con.prepareStatement(INSERT_HERO);
statement.setInt(1, heroId);
statement.setInt(2, hero.getInteger(Olympiad.CLASS_ID));
statement.setInt(3, hero.getInteger(COUNT));
statement.setInt(4, hero.getInteger(PLAYED));
statement.execute();
Connection con2 = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement2 = con2.prepareStatement(GET_CLAN_ALLY);
statement2.setInt(1, heroId);
ResultSet rset2 = statement2.executeQuery();
if (rset2.next())
{
int clanId = rset2.getInt("clanid");
int allyId = rset2.getInt("allyId");
String clanName = "";
String allyName = "";
int clanCrest = 0;
int allyCrest = 0;
if (clanId > 0)
{
clanName = ClanTable.getInstance().getClan(clanId).getName();
clanCrest = ClanTable.getInstance().getClan(clanId).getCrestId();
if (allyId > 0)
{
allyName = ClanTable.getInstance().getClan(clanId).getAllyName();
allyCrest = ClanTable.getInstance().getClan(clanId).getAllyCrestId();
}
}
hero.set(CLAN_CREST, clanCrest);
hero.set(CLAN_NAME, clanName);
hero.set(ALLY_CREST, allyCrest);
hero.set(ALLY_NAME, allyName);
}
rset2.close();
statement2.close();
con2.close();
_heroes.remove(heroId);
_heroes.put(heroId, hero);
_completeHeroes.put(heroId, hero);
}
else
{
statement = con.prepareStatement(UPDATE_HERO);
statement.setInt(1, hero.getInteger(COUNT));
statement.setInt(2, hero.getInteger(PLAYED));
statement.setInt(3, heroId);
statement.execute();
}
statement.close();
}
}
}
catch (SQLException e)
{
_log.warning("Hero System: Couldnt update Heroes");
if (Config.DEBUG)
e.printStackTrace();
}
finally
{
try
{
con.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
private void deleteItemsInDb()
{
Connection con = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement(DELETE_ITEMS);
statement.execute();
statement.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
try
{
con.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
@SuppressWarnings("synthetic-access")
private static class SingletonHolder
{
protected static final Hero _instance = new Hero();
}
}