actual freya branch
This commit is contained in:
@@ -0,0 +1,372 @@
|
||||
/*
|
||||
* 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 com.l2jserver.gameserver.datatables;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javolution.util.FastSet;
|
||||
|
||||
import com.l2jserver.Config;
|
||||
import com.l2jserver.L2DatabaseFactory;
|
||||
import com.l2jserver.gameserver.instancemanager.DayNightSpawnManager;
|
||||
import com.l2jserver.gameserver.model.L2Spawn;
|
||||
import com.l2jserver.gameserver.model.actor.L2Npc;
|
||||
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
|
||||
|
||||
/**
|
||||
* This class ...
|
||||
* @author Nightmare
|
||||
* @version $Revision: 1.5.2.6.2.7 $ $Date: 2005/03/27 15:29:18 $
|
||||
*/
|
||||
public class SpawnTable
|
||||
{
|
||||
private static Logger _log = Logger.getLogger(SpawnTable.class.getName());
|
||||
|
||||
private final FastSet<L2Spawn> _spawntable = new FastSet<L2Spawn>().shared();
|
||||
private int _npcSpawnCount;
|
||||
private int _customSpawnCount;
|
||||
|
||||
public static SpawnTable getInstance()
|
||||
{
|
||||
return SingletonHolder._instance;
|
||||
}
|
||||
|
||||
private SpawnTable()
|
||||
{
|
||||
if (!Config.ALT_DEV_NO_SPAWNS)
|
||||
{
|
||||
fillSpawnTable();
|
||||
}
|
||||
}
|
||||
|
||||
public FastSet<L2Spawn> getSpawnTable()
|
||||
{
|
||||
return _spawntable;
|
||||
}
|
||||
|
||||
private void fillSpawnTable()
|
||||
{
|
||||
Connection con = null;
|
||||
|
||||
try
|
||||
{
|
||||
con = L2DatabaseFactory.getInstance().getConnection();
|
||||
PreparedStatement statement = con.prepareStatement("SELECT count, npc_templateid, locx, locy, locz, heading, respawn_delay, loc_id, periodOfDay FROM spawnlist");
|
||||
ResultSet rset = statement.executeQuery();
|
||||
|
||||
L2Spawn spawnDat;
|
||||
L2NpcTemplate template1;
|
||||
|
||||
while (rset.next())
|
||||
{
|
||||
template1 = NpcTable.getInstance().getTemplate(rset.getInt("npc_templateid"));
|
||||
if (template1 != null)
|
||||
{
|
||||
if (template1.type.equalsIgnoreCase("L2SiegeGuard"))
|
||||
{
|
||||
// Don't spawn
|
||||
}
|
||||
else if (template1.type.equalsIgnoreCase("L2RaidBoss"))
|
||||
{
|
||||
// Don't spawn raidboss
|
||||
}
|
||||
else if (!Config.ALLOW_CLASS_MASTERS && template1.type.equals("L2ClassMaster"))
|
||||
{
|
||||
// Dont' spawn class masters
|
||||
}
|
||||
else
|
||||
{
|
||||
spawnDat = new L2Spawn(template1);
|
||||
spawnDat.setAmount(rset.getInt("count"));
|
||||
spawnDat.setLocx(rset.getInt("locx"));
|
||||
spawnDat.setLocy(rset.getInt("locy"));
|
||||
spawnDat.setLocz(rset.getInt("locz"));
|
||||
spawnDat.setHeading(rset.getInt("heading"));
|
||||
spawnDat.setRespawnDelay(rset.getInt("respawn_delay"));
|
||||
int loc_id = rset.getInt("loc_id");
|
||||
spawnDat.setLocation(loc_id);
|
||||
|
||||
switch (rset.getInt("periodOfDay"))
|
||||
{
|
||||
case 0: // default
|
||||
_npcSpawnCount += spawnDat.init();
|
||||
break;
|
||||
case 1: // Day
|
||||
DayNightSpawnManager.getInstance().addDayCreature(spawnDat);
|
||||
_npcSpawnCount++;
|
||||
break;
|
||||
case 2: // Night
|
||||
DayNightSpawnManager.getInstance().addNightCreature(spawnDat);
|
||||
_npcSpawnCount++;
|
||||
break;
|
||||
}
|
||||
|
||||
_spawntable.add(spawnDat);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_log.warning("SpawnTable: Data missing in NPC table for ID: " + rset.getInt("npc_templateid") + ".");
|
||||
}
|
||||
}
|
||||
rset.close();
|
||||
statement.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// problem with initializing spawn, go to next one
|
||||
_log.log(Level.WARNING, "SpawnTable: Spawn could not be initialized: " + e.getMessage(), e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
L2DatabaseFactory.close(con);
|
||||
}
|
||||
|
||||
_log.info("SpawnTable: Loaded " + _spawntable.size() + " Npc Spawn Locations.");
|
||||
|
||||
if (Config.CUSTOM_SPAWNLIST_TABLE)
|
||||
{
|
||||
try
|
||||
{
|
||||
con = L2DatabaseFactory.getInstance().getConnection();
|
||||
PreparedStatement statement = con.prepareStatement("SELECT count, npc_templateid, locx, locy, locz, heading, respawn_delay, loc_id, periodOfDay FROM custom_spawnlist");
|
||||
ResultSet rset = statement.executeQuery();
|
||||
|
||||
L2Spawn spawnDat;
|
||||
L2NpcTemplate template1;
|
||||
|
||||
while (rset.next())
|
||||
{
|
||||
template1 = NpcTable.getInstance().getTemplate(rset.getInt("npc_templateid"));
|
||||
if (template1 != null)
|
||||
{
|
||||
if (template1.type.equalsIgnoreCase("L2SiegeGuard"))
|
||||
{
|
||||
// Don't spawn
|
||||
}
|
||||
else if (template1.type.equalsIgnoreCase("L2RaidBoss"))
|
||||
{
|
||||
// Don't spawn raidboss
|
||||
}
|
||||
else if (!Config.ALLOW_CLASS_MASTERS && template1.type.equals("L2ClassMaster"))
|
||||
{
|
||||
// Dont' spawn class masters
|
||||
}
|
||||
else
|
||||
{
|
||||
spawnDat = new L2Spawn(template1);
|
||||
spawnDat.setAmount(rset.getInt("count"));
|
||||
spawnDat.setLocx(rset.getInt("locx"));
|
||||
spawnDat.setLocy(rset.getInt("locy"));
|
||||
spawnDat.setLocz(rset.getInt("locz"));
|
||||
spawnDat.setHeading(rset.getInt("heading"));
|
||||
spawnDat.setRespawnDelay(rset.getInt("respawn_delay"));
|
||||
spawnDat.setCustom(true);
|
||||
int loc_id = rset.getInt("loc_id");
|
||||
spawnDat.setLocation(loc_id);
|
||||
|
||||
switch (rset.getInt("periodOfDay"))
|
||||
{
|
||||
case 0: // default
|
||||
_customSpawnCount += spawnDat.init();
|
||||
break;
|
||||
case 1: // Day
|
||||
DayNightSpawnManager.getInstance().addDayCreature(spawnDat);
|
||||
_customSpawnCount++;
|
||||
break;
|
||||
case 2: // Night
|
||||
DayNightSpawnManager.getInstance().addNightCreature(spawnDat);
|
||||
_customSpawnCount++;
|
||||
break;
|
||||
}
|
||||
|
||||
_spawntable.add(spawnDat);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_log.warning("CustomSpawnTable: Data missing in NPC table for ID: " + rset.getInt("npc_templateid") + ".");
|
||||
}
|
||||
}
|
||||
rset.close();
|
||||
statement.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// problem with initializing spawn, go to next one
|
||||
_log.log(Level.WARNING, "CustomSpawnTable: Spawn could not be initialized: " + e.getMessage(), e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
L2DatabaseFactory.close(con);
|
||||
}
|
||||
_log.info("CustomSpawnTable: Loaded " + _customSpawnCount + " Npc Spawn Locations.");
|
||||
|
||||
}
|
||||
|
||||
if (Config.DEBUG)
|
||||
{
|
||||
_log.fine("SpawnTable: Spawning completed, total number of NPCs in the world: " + (_npcSpawnCount + _customSpawnCount));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void addNewSpawn(L2Spawn spawn, boolean storeInDb)
|
||||
{
|
||||
_spawntable.add(spawn);
|
||||
|
||||
if (storeInDb)
|
||||
{
|
||||
String spawnTable;
|
||||
if (spawn.isCustom() && Config.CUSTOM_SPAWNLIST_TABLE)
|
||||
{
|
||||
spawnTable = "custom_spawnlist";
|
||||
}
|
||||
else
|
||||
{
|
||||
spawnTable = "spawnlist";
|
||||
}
|
||||
|
||||
Connection con = null;
|
||||
try
|
||||
{
|
||||
con = L2DatabaseFactory.getInstance().getConnection();
|
||||
PreparedStatement statement = con.prepareStatement("INSERT INTO " + spawnTable + "(count,npc_templateid,locx,locy,locz,heading,respawn_delay,loc_id) values(?,?,?,?,?,?,?,?)");
|
||||
statement.setInt(1, spawn.getAmount());
|
||||
statement.setInt(2, spawn.getNpcid());
|
||||
statement.setInt(3, spawn.getLocx());
|
||||
statement.setInt(4, spawn.getLocy());
|
||||
statement.setInt(5, spawn.getLocz());
|
||||
statement.setInt(6, spawn.getHeading());
|
||||
statement.setInt(7, spawn.getRespawnDelay() / 1000);
|
||||
statement.setInt(8, spawn.getLocation());
|
||||
statement.execute();
|
||||
statement.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// problem with storing spawn
|
||||
_log.log(Level.WARNING, "SpawnTable: Could not store spawn in the DB:" + e.getMessage(), e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
L2DatabaseFactory.close(con);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void deleteSpawn(L2Spawn spawn, boolean updateDb)
|
||||
{
|
||||
|
||||
if (!_spawntable.remove(spawn))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (updateDb)
|
||||
{
|
||||
Connection con = null;
|
||||
try
|
||||
{
|
||||
con = L2DatabaseFactory.getInstance().getConnection();
|
||||
PreparedStatement statement = con.prepareStatement("DELETE FROM " + (spawn.isCustom() ? "custom_spawnlist" : "spawnlist") + " WHERE locx=? AND locy=? AND locz=? AND npc_templateid=? AND heading=?");
|
||||
statement.setInt(1, spawn.getLocx());
|
||||
statement.setInt(2, spawn.getLocy());
|
||||
statement.setInt(3, spawn.getLocz());
|
||||
statement.setInt(4, spawn.getNpcid());
|
||||
statement.setInt(5, spawn.getHeading());
|
||||
statement.execute();
|
||||
statement.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// problem with deleting spawn
|
||||
_log.log(Level.WARNING, "SpawnTable: Spawn " + spawn + " could not be removed from DB: " + e.getMessage(), e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
L2DatabaseFactory.close(con);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// just wrapper
|
||||
public void reloadAll()
|
||||
{
|
||||
fillSpawnTable();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the spawn of a NPC<BR>
|
||||
* <BR>
|
||||
* @param npcId : ID of the NPC to find.
|
||||
* @return
|
||||
*/
|
||||
public void findNPCInstances(L2PcInstance activeChar, int npcId, int teleportIndex, boolean showposition)
|
||||
{
|
||||
int index = 0;
|
||||
for (L2Spawn spawn : _spawntable)
|
||||
{
|
||||
|
||||
if (npcId == spawn.getNpcid())
|
||||
{
|
||||
index++;
|
||||
L2Npc _npc = spawn.getLastSpawn();
|
||||
if (teleportIndex > -1)
|
||||
{
|
||||
if (teleportIndex == index)
|
||||
{
|
||||
if (showposition && (_npc != null))
|
||||
{
|
||||
activeChar.teleToLocation(_npc.getX(), _npc.getY(), _npc.getZ(), true);
|
||||
}
|
||||
else
|
||||
{
|
||||
activeChar.teleToLocation(spawn.getLocx(), spawn.getLocy(), spawn.getLocz(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (showposition && (_npc != null))
|
||||
{
|
||||
activeChar.sendMessage(index + " - " + spawn.getTemplate().name + " (" + spawn + "): " + _npc.getX() + " " + _npc.getY() + " " + _npc.getZ());
|
||||
}
|
||||
else
|
||||
{
|
||||
activeChar.sendMessage(index + " - " + spawn.getTemplate().name + " (" + spawn + "): " + spawn.getLocx() + " " + spawn.getLocy() + " " + spawn.getLocz());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (index == 0)
|
||||
{
|
||||
activeChar.sendMessage("No current spawns found.");
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("synthetic-access")
|
||||
private static class SingletonHolder
|
||||
{
|
||||
protected static final SpawnTable _instance = new SpawnTable();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user