IdManager rework.

This commit is contained in:
MobiusDevelopment
2020-07-17 23:04:59 +00:00
parent 93c43783b2
commit 88570ccc47
414 changed files with 4556 additions and 4860 deletions
@@ -102,7 +102,6 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.handler.ConditionHandler; import org.l2jmobius.gameserver.handler.ConditionHandler;
import org.l2jmobius.gameserver.handler.EffectHandler; import org.l2jmobius.gameserver.handler.EffectHandler;
import org.l2jmobius.gameserver.handler.SkillConditionHandler; import org.l2jmobius.gameserver.handler.SkillConditionHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.AirShipManager; import org.l2jmobius.gameserver.instancemanager.AirShipManager;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager; import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.BoatManager; import org.l2jmobius.gameserver.instancemanager.BoatManager;
@@ -121,6 +120,7 @@ import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager; import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager; import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager; import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
@@ -203,9 +203,9 @@ public class GameServer
printSection("ThreadPool"); printSection("ThreadPool");
ThreadPool.init(); ThreadPool.init();
printSection("IdFactory"); printSection("IdManager");
IdFactory.init(); IdManager.getInstance();
if (!IdFactory.hasInitialized()) if (!IdManager.hasInitialized())
{ {
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration."); LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!"); throw new Exception("Could not initialize the ID factory!");
@@ -415,7 +415,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance()); Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size()); LOGGER.info("IdManager: Free ObjectID's remaining: " + IdManager.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{ {
@@ -35,9 +35,9 @@ import org.l2jmobius.gameserver.communitybbs.Manager.ForumsBBSManager;
import org.l2jmobius.gameserver.data.xml.impl.ClanHallData; import org.l2jmobius.gameserver.data.xml.impl.ClanHallData;
import org.l2jmobius.gameserver.enums.ClanWarState; import org.l2jmobius.gameserver.enums.ClanWarState;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.FortManager; import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.Clan;
@@ -195,7 +195,7 @@ public class ClanTable
return null; return null;
} }
final Clan clan = new Clan(IdFactory.getNextId(), clanName); final Clan clan = new Clan(IdManager.getInstance().getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player); final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader); clan.setLeader(leader);
leader.setPlayerInstance(player); leader.setPlayerInstance(player);
@@ -267,7 +267,7 @@ public class ClanTable
} }
_clans.remove(clanId); _clans.remove(clanId);
IdFactory.releaseId(clanId); IdManager.getInstance().releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection()) try (Connection con = DatabaseFactory.getConnection())
{ {
@@ -34,7 +34,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData;
import org.l2jmobius.gameserver.engines.DocumentEngine; import org.l2jmobius.gameserver.engines.DocumentEngine;
import org.l2jmobius.gameserver.enums.ItemLocation; import org.l2jmobius.gameserver.enums.ItemLocation;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
@@ -209,7 +209,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference) public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{ {
// Create and Init the ItemInstance corresponding to the Item Identifier // Create and Init the ItemInstance corresponding to the Item Identifier
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId)) if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{ {
ScheduledFuture<?> itemLootShedule; ScheduledFuture<?> itemLootShedule;
@@ -327,7 +327,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED); item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item); World.getInstance().removeObject(item);
IdFactory.releaseId(item.getObjectId()); IdManager.getInstance().releaseId(item.getObjectId());
if (Config.LOG_ITEMS) if (Config.LOG_ITEMS)
{ {
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.l2jmobius.gameserver.idfactory; package org.l2jmobius.gameserver.instancemanager;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@@ -33,39 +33,12 @@ import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.util.PrimeFinder; import org.l2jmobius.gameserver.util.PrimeFinder;
/** /**
* @author Mobius (reworked from L2J version) * @author Mobius (reworked from L2J IdFactory)
*/ */
public abstract class IdFactory public class IdManager
{ {
private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName()); private static final Logger LOGGER = Logger.getLogger(IdManager.class.getName());
protected static final String[] ID_CHECKS =
{
"SELECT owner_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT object_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT charId FROM character_quests WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_contacts WHERE charId >= ? AND charId < ?",
"SELECT contactId FROM character_contacts WHERE contactId >= ? AND contactId < ?",
"SELECT charId FROM character_friends WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_friends WHERE friendId >= ? AND friendId < ?",
"SELECT charId FROM character_hennas WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipebook WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipeshoplist WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_shortcuts WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_macroses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills_save WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_subclasses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM characters WHERE charId >= ? AND charId < ?",
"SELECT clanid FROM characters WHERE clanid >= ? AND clanid < ?",
"SELECT clan_id FROM clan_data WHERE clan_id >= ? AND clan_id < ?",
"SELECT clan_id FROM siege_clans WHERE clan_id >= ? AND clan_id < ?",
"SELECT ally_id FROM clan_data WHERE ally_id >= ? AND ally_id < ?",
"SELECT leader_id FROM clan_data WHERE leader_id >= ? AND leader_id < ?",
"SELECT item_obj_id FROM pets WHERE item_obj_id >= ? AND item_obj_id < ?",
"SELECT object_id FROM itemsonground WHERE object_id >= ? AND object_id < ?",
"SELECT summonId FROM characters_summons WHERE summonId >= ? AND summonId < ?"
};
//@formatter:off //@formatter:off
private static final String[][] ID_EXTRACTS = private static final String[][] ID_EXTRACTS =
{ {
@@ -76,21 +49,23 @@ public abstract class IdFactory
{"messages","messageId"} {"messages","messageId"}
}; };
//@formatter:on //@formatter:on
private static final String[] TIMESTAMPS_CLEAN = private static final String[] TIMESTAMPS_CLEAN =
{ {
"DELETE FROM character_instance_time WHERE time <= ?", "DELETE FROM character_instance_time WHERE time <= ?",
"DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?" "DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?"
}; };
public static final int FIRST_OID = 0x10000000;
public static final int LAST_OID = 0x7FFFFFFF; private static final int FIRST_OID = 0x10000000;
public static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID; private static final int LAST_OID = 0x7FFFFFFF;
private static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID;
private static BitSet _freeIds; private static BitSet _freeIds;
private static AtomicInteger _freeIdCount; private static AtomicInteger _freeIdCount;
private static AtomicInteger _nextFreeId; private static AtomicInteger _nextFreeId;
private static boolean _initialized; private static boolean _initialized;
public static void init() public IdManager()
{ {
// Update characters online status. // Update characters online status.
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
@@ -101,7 +76,7 @@ public abstract class IdFactory
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not update characters online status: " + e); LOGGER.warning("IdManager: Could not update characters online status: " + e);
} }
// Cleanup database. // Cleanup database.
@@ -182,11 +157,11 @@ public abstract class IdFactory
statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);"); statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);");
statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);"); statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
LOGGER.info("IdFactory: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds."); LOGGER.info("IdManager: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds.");
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not clean up database: " + e); LOGGER.warning("IdManager: Could not clean up database: " + e);
} }
} }
@@ -202,11 +177,11 @@ public abstract class IdFactory
cleanCount += statement.executeUpdate(); cleanCount += statement.executeUpdate();
} }
} }
LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database."); LOGGER.info("IdManager: Cleaned " + cleanCount + " expired timestamps from database.");
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e); LOGGER.warning("IdManager: Could not clean expired timestamps from database. " + e);
} }
// Initialize. // Initialize.
@@ -243,7 +218,7 @@ public abstract class IdFactory
final int objectId = usedObjectId - FIRST_OID; final int objectId = usedObjectId - FIRST_OID;
if (objectId < 0) if (objectId < 0)
{ {
LOGGER.warning("IdFactory: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID); LOGGER.warning("IdManager: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID);
continue; continue;
} }
_freeIds.set(usedObjectId - FIRST_OID); _freeIds.set(usedObjectId - FIRST_OID);
@@ -256,7 +231,7 @@ public abstract class IdFactory
catch (Exception e) catch (Exception e)
{ {
_initialized = false; _initialized = false;
LOGGER.severe("IdFactory: Could not be initialized properly: " + e.getMessage()); LOGGER.severe("IdManager: Could not be initialized properly: " + e.getMessage());
} }
// Schedule increase capacity task. // Schedule increase capacity task.
@@ -271,10 +246,10 @@ public abstract class IdFactory
} }
}, 30000, 30000); }, 30000, 30000);
LOGGER.info("IdFactory: " + _freeIds.size() + " id's available."); LOGGER.info("IdManager: " + _freeIds.size() + " id's available.");
} }
public synchronized static void releaseId(int objectId) public void releaseId(int objectId)
{ {
synchronized (_nextFreeId) synchronized (_nextFreeId)
{ {
@@ -285,12 +260,12 @@ public abstract class IdFactory
} }
else else
{ {
LOGGER.warning("IdFactory: Release objectID " + objectId + " failed (< " + FIRST_OID + ")"); LOGGER.warning("IdManager: Release objectID " + objectId + " failed (< " + FIRST_OID + ")");
} }
} }
} }
public synchronized static int getNextId() public int getNextId()
{ {
synchronized (_nextFreeId) synchronized (_nextFreeId)
{ {
@@ -303,7 +278,7 @@ public abstract class IdFactory
{ {
if (_freeIds.size() >= FREE_OBJECT_ID_SIZE) if (_freeIds.size() >= FREE_OBJECT_ID_SIZE)
{ {
throw new NullPointerException("IdFactory: Ran out of valid ids."); throw new NullPointerException("IdManager: Ran out of valid ids.");
} }
increaseBitSetCapacity(); increaseBitSetCapacity();
} }
@@ -313,14 +288,14 @@ public abstract class IdFactory
} }
} }
private static void increaseBitSetCapacity() private void increaseBitSetCapacity()
{ {
final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10)); final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
newBitSet.or(_freeIds); newBitSet.or(_freeIds);
_freeIds = newBitSet; _freeIds = newBitSet;
} }
private static int usedIdCount() private int usedIdCount()
{ {
return _freeIdCount.get() - FIRST_OID; return _freeIdCount.get() - FIRST_OID;
} }
@@ -334,4 +309,14 @@ public abstract class IdFactory
{ {
return _initialized; return _initialized;
} }
public static IdManager getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final IdManager INSTANCE = new IdManager();
}
} }
@@ -31,7 +31,6 @@ import java.util.logging.Logger;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.enums.MailType; import org.l2jmobius.gameserver.enums.MailType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.entity.Message; import org.l2jmobius.gameserver.model.entity.Message;
@@ -277,7 +276,7 @@ public class MailManager
} }
_messages.remove(msgId); _messages.remove(msgId);
IdFactory.releaseId(msgId); IdManager.getInstance().releaseId(msgId);
} }
/** /**
@@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.enums.PetitionState; import org.l2jmobius.gameserver.enums.PetitionState;
import org.l2jmobius.gameserver.enums.PetitionType; import org.l2jmobius.gameserver.enums.PetitionType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.PetitionManager; import org.l2jmobius.gameserver.instancemanager.PetitionManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType) public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
_type = PetitionType.values()[petitionType - 1]; _type = PetitionType.values()[petitionType - 1];
_content = petitionText; _content = petitionText;
_petitioner = petitioner; _petitioner = petitioner;
@@ -24,7 +24,7 @@ import org.l2jmobius.gameserver.handler.ActionHandler;
import org.l2jmobius.gameserver.handler.ActionShiftHandler; import org.l2jmobius.gameserver.handler.ActionShiftHandler;
import org.l2jmobius.gameserver.handler.IActionHandler; import org.l2jmobius.gameserver.handler.IActionHandler;
import org.l2jmobius.gameserver.handler.IActionShiftHandler; import org.l2jmobius.gameserver.handler.IActionShiftHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -154,8 +154,8 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
public void refreshId() public void refreshId()
{ {
World.getInstance().removeObject(this); World.getInstance().removeObject(this);
IdFactory.releaseId(getObjectId()); IdManager.getInstance().releaseId(getObjectId());
_objectId = IdFactory.getNextId(); _objectId = IdManager.getInstance().getNextId();
} }
@Override @Override
@@ -63,7 +63,7 @@ import org.l2jmobius.gameserver.enums.Team;
import org.l2jmobius.gameserver.enums.TeleportWhereType; import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
@@ -288,7 +288,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public Creature(CreatureTemplate template) public Creature(CreatureTemplate template)
{ {
this(IdFactory.getNextId(), template); this(IdManager.getInstance().getNextId(), template);
} }
/** /**
@@ -20,7 +20,7 @@ import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType; import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.actor.stat.ControllableAirShipStat; import org.l2jmobius.gameserver.model.actor.stat.ControllableAirShipStat;
import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate; import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template); super(template);
setInstanceType(InstanceType.ControllableAirShipInstance); setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId; _ownerId = ownerId;
_helmId = IdFactory.getNextId(); // not forget to release ! _helmId = IdManager.getInstance().getNextId(); // not forget to release !
} }
@Override @Override
@@ -282,8 +282,8 @@ public class ControllableAirShipInstance extends AirShipInstance
public void refreshId() public void refreshId()
{ {
super.refreshId(); super.refreshId();
IdFactory.releaseId(_helmId); IdManager.getInstance().releaseId(_helmId);
_helmId = IdFactory.getNextId(); _helmId = IdManager.getInstance().getNextId();
} }
@Override @Override
@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.actor.instance;
import org.l2jmobius.gameserver.data.xml.impl.FenceData; import org.l2jmobius.gameserver.data.xml.impl.FenceData;
import org.l2jmobius.gameserver.enums.FenceState; import org.l2jmobius.gameserver.enums.FenceState;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
@@ -44,7 +44,7 @@ public class FenceInstance extends WorldObject
public FenceInstance(int x, int y, String name, int width, int length, int height, FenceState state) public FenceInstance(int x, int y, String name, int width, int length, int height, FenceState state)
{ {
super(IdFactory.getNextId()); super(IdManager.getInstance().getNextId());
_xMin = x - (width / 2); _xMin = x - (width / 2);
_xMax = x + (width / 2); _xMax = x + (width / 2);
@@ -59,7 +59,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1]; _heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++) for (int i = 0; i < _heightFences.length; i++)
{ {
_heightFences[i] = IdFactory.getNextId(); _heightFences[i] = IdManager.getInstance().getNextId();
} }
} }
} }
@@ -104,7 +104,6 @@ import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.handler.IItemHandler; import org.l2jmobius.gameserver.handler.IItemHandler;
import org.l2jmobius.gameserver.handler.ItemHandler; import org.l2jmobius.gameserver.handler.ItemHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager; import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
@@ -113,6 +112,7 @@ import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager; import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager; import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
@@ -1141,7 +1141,7 @@ public class PlayerInstance extends Playable
*/ */
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app) private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{ {
this(IdFactory.getNextId(), template, accountName, app); this(IdManager.getInstance().getNextId(), template, accountName, app);
} }
@Override @Override
@@ -21,7 +21,7 @@ import java.util.Locale;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.util.StringUtil; import org.l2jmobius.commons.util.StringUtil;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.HistoryInfo; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.HistoryInfo;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.RaceState; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.RaceState;
@@ -160,7 +160,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0); player.setRace(0, 0);
player.setRace(1, 0); player.setRace(1, 0);
ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443); ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), 4443);
item.setCount(1); item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber()); item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket); item.setCustomType1(ticket);
@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.announce;
import java.util.Date; import java.util.Date;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.script.DateRange; import org.l2jmobius.gameserver.script.DateRange;
/** /**
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content) public EventAnnouncement(DateRange range, String content)
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
_range = range; _range = range;
_content = content; _content = content;
} }
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override @Override
public boolean deleteMe() public boolean deleteMe()
{ {
IdFactory.releaseId(_id); IdManager.getInstance().releaseId(_id);
return true; return true;
} }
@@ -24,7 +24,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
/** /**
@@ -85,7 +85,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)")) PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
ps.setInt(1, _id); ps.setInt(1, _id);
ps.setInt(2, _player1Id); ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id); ps.setInt(3, _player2Id);
@@ -24,7 +24,7 @@ import java.sql.SQLException;
import org.l2jmobius.gameserver.data.sql.impl.CharNameTable; import org.l2jmobius.gameserver.data.sql.impl.CharNameTable;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.MailType; import org.l2jmobius.gameserver.enums.MailType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.MailManager; import org.l2jmobius.gameserver.instancemanager.MailManager;
import org.l2jmobius.gameserver.model.itemcontainer.Mail; import org.l2jmobius.gameserver.model.itemcontainer.Mail;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -99,7 +99,7 @@ public class Message
*/ */
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena) public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = senderId; _senderId = senderId;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/ */
public Message(int receiverId, String subject, String content, MailType sendBySystem) public Message(int receiverId, String subject, String content, MailType sendBySystem)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = -1; _senderId = -1;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/ */
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem) public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = senderId; _senderId = senderId;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/ */
public Message(Message msg) public Message(Message msg)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = msg.getSenderId(); _senderId = msg.getSenderId();
_receiverId = msg.getSenderId(); _receiverId = msg.getSenderId();
_subject = ""; _subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType) public Message(int receiverId, ItemInstance item, MailType mailType)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = -1; _senderId = -1;
_receiverId = receiverId; _receiverId = receiverId;
_subject = ""; _subject = "";
@@ -17,7 +17,7 @@
package org.l2jmobius.gameserver.model.itemauction; package org.l2jmobius.gameserver.model.itemauction;
import org.l2jmobius.gameserver.datatables.ItemTable; import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -78,7 +78,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance() public ItemInstance createNewItemInstance()
{ {
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), _itemId);
World.getInstance().addObject(item); World.getInstance().addObject(item);
item.setCount(_itemCount); item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel()); item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
@@ -46,8 +46,8 @@ import org.l2jmobius.gameserver.enums.ItemLocation;
import org.l2jmobius.gameserver.enums.ItemSkillType; import org.l2jmobius.gameserver.enums.ItemSkillType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
import org.l2jmobius.gameserver.instancemanager.SiegeGuardManager; import org.l2jmobius.gameserver.instancemanager.SiegeGuardManager;
import org.l2jmobius.gameserver.model.DropProtection; import org.l2jmobius.gameserver.model.DropProtection;
@@ -254,7 +254,7 @@ public class ItemInstance extends WorldObject
*/ */
public ItemInstance(int itemId) public ItemInstance(int itemId)
{ {
this(IdFactory.getNextId(), itemId); this(IdManager.getInstance().getNextId(), itemId);
} }
/** /**
@@ -16,7 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model.zone; package org.l2jmobius.gameserver.model.zone;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z) protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{ {
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), itemId);
item.setCount(num); item.setCount(num);
item.spawnMe(x, y, z + 5); item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item); ZoneManager.getInstance().getDebugItems().add(item);
@@ -106,7 +106,6 @@ import org.l2jmobius.gameserver.handler.ConditionHandler;
import org.l2jmobius.gameserver.handler.DailyMissionHandler; import org.l2jmobius.gameserver.handler.DailyMissionHandler;
import org.l2jmobius.gameserver.handler.EffectHandler; import org.l2jmobius.gameserver.handler.EffectHandler;
import org.l2jmobius.gameserver.handler.SkillConditionHandler; import org.l2jmobius.gameserver.handler.SkillConditionHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.AirShipManager; import org.l2jmobius.gameserver.instancemanager.AirShipManager;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager; import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.BoatManager; import org.l2jmobius.gameserver.instancemanager.BoatManager;
@@ -125,6 +124,7 @@ import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager; import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager; import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager; import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
@@ -207,9 +207,9 @@ public class GameServer
printSection("ThreadPool"); printSection("ThreadPool");
ThreadPool.init(); ThreadPool.init();
printSection("IdFactory"); printSection("IdManager");
IdFactory.init(); IdManager.getInstance();
if (!IdFactory.hasInitialized()) if (!IdManager.hasInitialized())
{ {
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration."); LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!"); throw new Exception("Could not initialize the ID factory!");
@@ -423,7 +423,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance()); Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size()); LOGGER.info("IdManager: Free ObjectID's remaining: " + IdManager.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{ {
@@ -35,9 +35,9 @@ import org.l2jmobius.gameserver.communitybbs.Manager.ForumsBBSManager;
import org.l2jmobius.gameserver.data.xml.impl.ClanHallData; import org.l2jmobius.gameserver.data.xml.impl.ClanHallData;
import org.l2jmobius.gameserver.enums.ClanWarState; import org.l2jmobius.gameserver.enums.ClanWarState;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.FortManager; import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.Clan;
@@ -195,7 +195,7 @@ public class ClanTable
return null; return null;
} }
final Clan clan = new Clan(IdFactory.getNextId(), clanName); final Clan clan = new Clan(IdManager.getInstance().getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player); final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader); clan.setLeader(leader);
leader.setPlayerInstance(player); leader.setPlayerInstance(player);
@@ -267,7 +267,7 @@ public class ClanTable
} }
_clans.remove(clanId); _clans.remove(clanId);
IdFactory.releaseId(clanId); IdManager.getInstance().releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection()) try (Connection con = DatabaseFactory.getConnection())
{ {
@@ -34,7 +34,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData;
import org.l2jmobius.gameserver.engines.DocumentEngine; import org.l2jmobius.gameserver.engines.DocumentEngine;
import org.l2jmobius.gameserver.enums.ItemLocation; import org.l2jmobius.gameserver.enums.ItemLocation;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
@@ -209,7 +209,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference) public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{ {
// Create and Init the ItemInstance corresponding to the Item Identifier // Create and Init the ItemInstance corresponding to the Item Identifier
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId)) if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{ {
ScheduledFuture<?> itemLootShedule; ScheduledFuture<?> itemLootShedule;
@@ -327,7 +327,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED); item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item); World.getInstance().removeObject(item);
IdFactory.releaseId(item.getObjectId()); IdManager.getInstance().releaseId(item.getObjectId());
if (Config.LOG_ITEMS) if (Config.LOG_ITEMS)
{ {
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.l2jmobius.gameserver.idfactory; package org.l2jmobius.gameserver.instancemanager;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@@ -33,39 +33,12 @@ import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.util.PrimeFinder; import org.l2jmobius.gameserver.util.PrimeFinder;
/** /**
* @author Mobius (reworked from L2J version) * @author Mobius (reworked from L2J IdFactory)
*/ */
public abstract class IdFactory public class IdManager
{ {
private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName()); private static final Logger LOGGER = Logger.getLogger(IdManager.class.getName());
protected static final String[] ID_CHECKS =
{
"SELECT owner_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT object_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT charId FROM character_quests WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_contacts WHERE charId >= ? AND charId < ?",
"SELECT contactId FROM character_contacts WHERE contactId >= ? AND contactId < ?",
"SELECT charId FROM character_friends WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_friends WHERE friendId >= ? AND friendId < ?",
"SELECT charId FROM character_hennas WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipebook WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipeshoplist WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_shortcuts WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_macroses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills_save WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_subclasses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM characters WHERE charId >= ? AND charId < ?",
"SELECT clanid FROM characters WHERE clanid >= ? AND clanid < ?",
"SELECT clan_id FROM clan_data WHERE clan_id >= ? AND clan_id < ?",
"SELECT clan_id FROM siege_clans WHERE clan_id >= ? AND clan_id < ?",
"SELECT ally_id FROM clan_data WHERE ally_id >= ? AND ally_id < ?",
"SELECT leader_id FROM clan_data WHERE leader_id >= ? AND leader_id < ?",
"SELECT item_obj_id FROM pets WHERE item_obj_id >= ? AND item_obj_id < ?",
"SELECT object_id FROM itemsonground WHERE object_id >= ? AND object_id < ?",
"SELECT summonId FROM characters_summons WHERE summonId >= ? AND summonId < ?"
};
//@formatter:off //@formatter:off
private static final String[][] ID_EXTRACTS = private static final String[][] ID_EXTRACTS =
{ {
@@ -76,21 +49,23 @@ public abstract class IdFactory
{"messages","messageId"} {"messages","messageId"}
}; };
//@formatter:on //@formatter:on
private static final String[] TIMESTAMPS_CLEAN = private static final String[] TIMESTAMPS_CLEAN =
{ {
"DELETE FROM character_instance_time WHERE time <= ?", "DELETE FROM character_instance_time WHERE time <= ?",
"DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?" "DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?"
}; };
public static final int FIRST_OID = 0x10000000;
public static final int LAST_OID = 0x7FFFFFFF; private static final int FIRST_OID = 0x10000000;
public static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID; private static final int LAST_OID = 0x7FFFFFFF;
private static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID;
private static BitSet _freeIds; private static BitSet _freeIds;
private static AtomicInteger _freeIdCount; private static AtomicInteger _freeIdCount;
private static AtomicInteger _nextFreeId; private static AtomicInteger _nextFreeId;
private static boolean _initialized; private static boolean _initialized;
public static void init() public IdManager()
{ {
// Update characters online status. // Update characters online status.
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
@@ -101,7 +76,7 @@ public abstract class IdFactory
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not update characters online status: " + e); LOGGER.warning("IdManager: Could not update characters online status: " + e);
} }
// Cleanup database. // Cleanup database.
@@ -182,11 +157,11 @@ public abstract class IdFactory
statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);"); statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);");
statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);"); statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
LOGGER.info("IdFactory: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds."); LOGGER.info("IdManager: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds.");
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not clean up database: " + e); LOGGER.warning("IdManager: Could not clean up database: " + e);
} }
} }
@@ -202,11 +177,11 @@ public abstract class IdFactory
cleanCount += statement.executeUpdate(); cleanCount += statement.executeUpdate();
} }
} }
LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database."); LOGGER.info("IdManager: Cleaned " + cleanCount + " expired timestamps from database.");
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e); LOGGER.warning("IdManager: Could not clean expired timestamps from database. " + e);
} }
// Initialize. // Initialize.
@@ -243,7 +218,7 @@ public abstract class IdFactory
final int objectId = usedObjectId - FIRST_OID; final int objectId = usedObjectId - FIRST_OID;
if (objectId < 0) if (objectId < 0)
{ {
LOGGER.warning("IdFactory: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID); LOGGER.warning("IdManager: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID);
continue; continue;
} }
_freeIds.set(usedObjectId - FIRST_OID); _freeIds.set(usedObjectId - FIRST_OID);
@@ -256,7 +231,7 @@ public abstract class IdFactory
catch (Exception e) catch (Exception e)
{ {
_initialized = false; _initialized = false;
LOGGER.severe("IdFactory: Could not be initialized properly: " + e.getMessage()); LOGGER.severe("IdManager: Could not be initialized properly: " + e.getMessage());
} }
// Schedule increase capacity task. // Schedule increase capacity task.
@@ -271,10 +246,10 @@ public abstract class IdFactory
} }
}, 30000, 30000); }, 30000, 30000);
LOGGER.info("IdFactory: " + _freeIds.size() + " id's available."); LOGGER.info("IdManager: " + _freeIds.size() + " id's available.");
} }
public synchronized static void releaseId(int objectId) public void releaseId(int objectId)
{ {
synchronized (_nextFreeId) synchronized (_nextFreeId)
{ {
@@ -285,12 +260,12 @@ public abstract class IdFactory
} }
else else
{ {
LOGGER.warning("IdFactory: Release objectID " + objectId + " failed (< " + FIRST_OID + ")"); LOGGER.warning("IdManager: Release objectID " + objectId + " failed (< " + FIRST_OID + ")");
} }
} }
} }
public synchronized static int getNextId() public int getNextId()
{ {
synchronized (_nextFreeId) synchronized (_nextFreeId)
{ {
@@ -303,7 +278,7 @@ public abstract class IdFactory
{ {
if (_freeIds.size() >= FREE_OBJECT_ID_SIZE) if (_freeIds.size() >= FREE_OBJECT_ID_SIZE)
{ {
throw new NullPointerException("IdFactory: Ran out of valid ids."); throw new NullPointerException("IdManager: Ran out of valid ids.");
} }
increaseBitSetCapacity(); increaseBitSetCapacity();
} }
@@ -313,14 +288,14 @@ public abstract class IdFactory
} }
} }
private static void increaseBitSetCapacity() private void increaseBitSetCapacity()
{ {
final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10)); final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
newBitSet.or(_freeIds); newBitSet.or(_freeIds);
_freeIds = newBitSet; _freeIds = newBitSet;
} }
private static int usedIdCount() private int usedIdCount()
{ {
return _freeIdCount.get() - FIRST_OID; return _freeIdCount.get() - FIRST_OID;
} }
@@ -334,4 +309,14 @@ public abstract class IdFactory
{ {
return _initialized; return _initialized;
} }
public static IdManager getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final IdManager INSTANCE = new IdManager();
}
} }
@@ -31,7 +31,6 @@ import java.util.logging.Logger;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.enums.MailType; import org.l2jmobius.gameserver.enums.MailType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.entity.Message; import org.l2jmobius.gameserver.model.entity.Message;
@@ -277,7 +276,7 @@ public class MailManager
} }
_messages.remove(msgId); _messages.remove(msgId);
IdFactory.releaseId(msgId); IdManager.getInstance().releaseId(msgId);
} }
/** /**
@@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.enums.PetitionState; import org.l2jmobius.gameserver.enums.PetitionState;
import org.l2jmobius.gameserver.enums.PetitionType; import org.l2jmobius.gameserver.enums.PetitionType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.PetitionManager; import org.l2jmobius.gameserver.instancemanager.PetitionManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType) public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
_type = PetitionType.values()[petitionType - 1]; _type = PetitionType.values()[petitionType - 1];
_content = petitionText; _content = petitionText;
_petitioner = petitioner; _petitioner = petitioner;
@@ -24,7 +24,7 @@ import org.l2jmobius.gameserver.handler.ActionHandler;
import org.l2jmobius.gameserver.handler.ActionShiftHandler; import org.l2jmobius.gameserver.handler.ActionShiftHandler;
import org.l2jmobius.gameserver.handler.IActionHandler; import org.l2jmobius.gameserver.handler.IActionHandler;
import org.l2jmobius.gameserver.handler.IActionShiftHandler; import org.l2jmobius.gameserver.handler.IActionShiftHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -154,8 +154,8 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
public void refreshId() public void refreshId()
{ {
World.getInstance().removeObject(this); World.getInstance().removeObject(this);
IdFactory.releaseId(getObjectId()); IdManager.getInstance().releaseId(getObjectId());
_objectId = IdFactory.getNextId(); _objectId = IdManager.getInstance().getNextId();
} }
@Override @Override
@@ -63,7 +63,7 @@ import org.l2jmobius.gameserver.enums.Team;
import org.l2jmobius.gameserver.enums.TeleportWhereType; import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
@@ -288,7 +288,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public Creature(CreatureTemplate template) public Creature(CreatureTemplate template)
{ {
this(IdFactory.getNextId(), template); this(IdManager.getInstance().getNextId(), template);
} }
/** /**
@@ -20,7 +20,7 @@ import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType; import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.actor.stat.ControllableAirShipStat; import org.l2jmobius.gameserver.model.actor.stat.ControllableAirShipStat;
import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate; import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template); super(template);
setInstanceType(InstanceType.ControllableAirShipInstance); setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId; _ownerId = ownerId;
_helmId = IdFactory.getNextId(); // not forget to release ! _helmId = IdManager.getInstance().getNextId(); // not forget to release !
} }
@Override @Override
@@ -282,8 +282,8 @@ public class ControllableAirShipInstance extends AirShipInstance
public void refreshId() public void refreshId()
{ {
super.refreshId(); super.refreshId();
IdFactory.releaseId(_helmId); IdManager.getInstance().releaseId(_helmId);
_helmId = IdFactory.getNextId(); _helmId = IdManager.getInstance().getNextId();
} }
@Override @Override
@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.actor.instance;
import org.l2jmobius.gameserver.data.xml.impl.FenceData; import org.l2jmobius.gameserver.data.xml.impl.FenceData;
import org.l2jmobius.gameserver.enums.FenceState; import org.l2jmobius.gameserver.enums.FenceState;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
@@ -44,7 +44,7 @@ public class FenceInstance extends WorldObject
public FenceInstance(int x, int y, String name, int width, int length, int height, FenceState state) public FenceInstance(int x, int y, String name, int width, int length, int height, FenceState state)
{ {
super(IdFactory.getNextId()); super(IdManager.getInstance().getNextId());
_xMin = x - (width / 2); _xMin = x - (width / 2);
_xMax = x + (width / 2); _xMax = x + (width / 2);
@@ -59,7 +59,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1]; _heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++) for (int i = 0; i < _heightFences.length; i++)
{ {
_heightFences[i] = IdFactory.getNextId(); _heightFences[i] = IdManager.getInstance().getNextId();
} }
} }
} }
@@ -105,7 +105,6 @@ import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.handler.IItemHandler; import org.l2jmobius.gameserver.handler.IItemHandler;
import org.l2jmobius.gameserver.handler.ItemHandler; import org.l2jmobius.gameserver.handler.ItemHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager; import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
@@ -114,6 +113,7 @@ import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager; import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager; import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
@@ -1147,7 +1147,7 @@ public class PlayerInstance extends Playable
*/ */
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app) private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{ {
this(IdFactory.getNextId(), template, accountName, app); this(IdManager.getInstance().getNextId(), template, accountName, app);
} }
@Override @Override
@@ -21,7 +21,7 @@ import java.util.Locale;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.util.StringUtil; import org.l2jmobius.commons.util.StringUtil;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.HistoryInfo; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.HistoryInfo;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.RaceState; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.RaceState;
@@ -160,7 +160,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0); player.setRace(0, 0);
player.setRace(1, 0); player.setRace(1, 0);
ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443); ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), 4443);
item.setCount(1); item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber()); item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket); item.setCustomType1(ticket);
@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.announce;
import java.util.Date; import java.util.Date;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.script.DateRange; import org.l2jmobius.gameserver.script.DateRange;
/** /**
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content) public EventAnnouncement(DateRange range, String content)
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
_range = range; _range = range;
_content = content; _content = content;
} }
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override @Override
public boolean deleteMe() public boolean deleteMe()
{ {
IdFactory.releaseId(_id); IdManager.getInstance().releaseId(_id);
return true; return true;
} }
@@ -24,7 +24,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
/** /**
@@ -85,7 +85,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)")) PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
ps.setInt(1, _id); ps.setInt(1, _id);
ps.setInt(2, _player1Id); ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id); ps.setInt(3, _player2Id);
@@ -24,7 +24,7 @@ import java.sql.SQLException;
import org.l2jmobius.gameserver.data.sql.impl.CharNameTable; import org.l2jmobius.gameserver.data.sql.impl.CharNameTable;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.MailType; import org.l2jmobius.gameserver.enums.MailType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.MailManager; import org.l2jmobius.gameserver.instancemanager.MailManager;
import org.l2jmobius.gameserver.model.itemcontainer.Mail; import org.l2jmobius.gameserver.model.itemcontainer.Mail;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -99,7 +99,7 @@ public class Message
*/ */
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena) public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = senderId; _senderId = senderId;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/ */
public Message(int receiverId, String subject, String content, MailType sendBySystem) public Message(int receiverId, String subject, String content, MailType sendBySystem)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = -1; _senderId = -1;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/ */
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem) public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = senderId; _senderId = senderId;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/ */
public Message(Message msg) public Message(Message msg)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = msg.getSenderId(); _senderId = msg.getSenderId();
_receiverId = msg.getSenderId(); _receiverId = msg.getSenderId();
_subject = ""; _subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType) public Message(int receiverId, ItemInstance item, MailType mailType)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = -1; _senderId = -1;
_receiverId = receiverId; _receiverId = receiverId;
_subject = ""; _subject = "";
@@ -17,7 +17,7 @@
package org.l2jmobius.gameserver.model.itemauction; package org.l2jmobius.gameserver.model.itemauction;
import org.l2jmobius.gameserver.datatables.ItemTable; import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -78,7 +78,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance() public ItemInstance createNewItemInstance()
{ {
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), _itemId);
World.getInstance().addObject(item); World.getInstance().addObject(item);
item.setCount(_itemCount); item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel()); item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
@@ -47,8 +47,8 @@ import org.l2jmobius.gameserver.enums.ItemLocation;
import org.l2jmobius.gameserver.enums.ItemSkillType; import org.l2jmobius.gameserver.enums.ItemSkillType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
import org.l2jmobius.gameserver.instancemanager.SiegeGuardManager; import org.l2jmobius.gameserver.instancemanager.SiegeGuardManager;
import org.l2jmobius.gameserver.model.DropProtection; import org.l2jmobius.gameserver.model.DropProtection;
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/ */
public ItemInstance(int itemId) public ItemInstance(int itemId)
{ {
this(IdFactory.getNextId(), itemId); this(IdManager.getInstance().getNextId(), itemId);
} }
/** /**
@@ -16,7 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model.zone; package org.l2jmobius.gameserver.model.zone;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z) protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{ {
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), itemId);
item.setCount(num); item.setCount(num);
item.spawnMe(x, y, z + 5); item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item); ZoneManager.getInstance().getDebugItems().add(item);
@@ -106,7 +106,6 @@ import org.l2jmobius.gameserver.handler.ConditionHandler;
import org.l2jmobius.gameserver.handler.DailyMissionHandler; import org.l2jmobius.gameserver.handler.DailyMissionHandler;
import org.l2jmobius.gameserver.handler.EffectHandler; import org.l2jmobius.gameserver.handler.EffectHandler;
import org.l2jmobius.gameserver.handler.SkillConditionHandler; import org.l2jmobius.gameserver.handler.SkillConditionHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.AirShipManager; import org.l2jmobius.gameserver.instancemanager.AirShipManager;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager; import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.BoatManager; import org.l2jmobius.gameserver.instancemanager.BoatManager;
@@ -125,6 +124,7 @@ import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager; import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager; import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager; import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
@@ -207,9 +207,9 @@ public class GameServer
printSection("ThreadPool"); printSection("ThreadPool");
ThreadPool.init(); ThreadPool.init();
printSection("IdFactory"); printSection("IdManager");
IdFactory.init(); IdManager.getInstance();
if (!IdFactory.hasInitialized()) if (!IdManager.hasInitialized())
{ {
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration."); LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!"); throw new Exception("Could not initialize the ID factory!");
@@ -423,7 +423,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance()); Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size()); LOGGER.info("IdManager: Free ObjectID's remaining: " + IdManager.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{ {
@@ -35,10 +35,10 @@ import org.l2jmobius.gameserver.communitybbs.Manager.ForumsBBSManager;
import org.l2jmobius.gameserver.data.xml.impl.ClanHallData; import org.l2jmobius.gameserver.data.xml.impl.ClanHallData;
import org.l2jmobius.gameserver.enums.ClanWarState; import org.l2jmobius.gameserver.enums.ClanWarState;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.ClanEntryManager; import org.l2jmobius.gameserver.instancemanager.ClanEntryManager;
import org.l2jmobius.gameserver.instancemanager.FortManager; import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.Clan;
@@ -196,7 +196,7 @@ public class ClanTable
return null; return null;
} }
final Clan clan = new Clan(IdFactory.getNextId(), clanName); final Clan clan = new Clan(IdManager.getInstance().getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player); final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader); clan.setLeader(leader);
leader.setPlayerInstance(player); leader.setPlayerInstance(player);
@@ -271,7 +271,7 @@ public class ClanTable
} }
_clans.remove(clanId); _clans.remove(clanId);
IdFactory.releaseId(clanId); IdManager.getInstance().releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection()) try (Connection con = DatabaseFactory.getConnection())
{ {
@@ -34,7 +34,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData;
import org.l2jmobius.gameserver.engines.DocumentEngine; import org.l2jmobius.gameserver.engines.DocumentEngine;
import org.l2jmobius.gameserver.enums.ItemLocation; import org.l2jmobius.gameserver.enums.ItemLocation;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
@@ -209,7 +209,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference) public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{ {
// Create and Init the ItemInstance corresponding to the Item Identifier // Create and Init the ItemInstance corresponding to the Item Identifier
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId)) if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{ {
ScheduledFuture<?> itemLootShedule; ScheduledFuture<?> itemLootShedule;
@@ -327,7 +327,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED); item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item); World.getInstance().removeObject(item);
IdFactory.releaseId(item.getObjectId()); IdManager.getInstance().releaseId(item.getObjectId());
if (Config.LOG_ITEMS) if (Config.LOG_ITEMS)
{ {
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.l2jmobius.gameserver.idfactory; package org.l2jmobius.gameserver.instancemanager;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@@ -33,39 +33,12 @@ import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.util.PrimeFinder; import org.l2jmobius.gameserver.util.PrimeFinder;
/** /**
* @author Mobius (reworked from L2J version) * @author Mobius (reworked from L2J IdFactory)
*/ */
public abstract class IdFactory public class IdManager
{ {
private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName()); private static final Logger LOGGER = Logger.getLogger(IdManager.class.getName());
protected static final String[] ID_CHECKS =
{
"SELECT owner_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT object_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT charId FROM character_quests WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_contacts WHERE charId >= ? AND charId < ?",
"SELECT contactId FROM character_contacts WHERE contactId >= ? AND contactId < ?",
"SELECT charId FROM character_friends WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_friends WHERE friendId >= ? AND friendId < ?",
"SELECT charId FROM character_hennas WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipebook WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipeshoplist WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_shortcuts WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_macroses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills_save WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_subclasses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM characters WHERE charId >= ? AND charId < ?",
"SELECT clanid FROM characters WHERE clanid >= ? AND clanid < ?",
"SELECT clan_id FROM clan_data WHERE clan_id >= ? AND clan_id < ?",
"SELECT clan_id FROM siege_clans WHERE clan_id >= ? AND clan_id < ?",
"SELECT ally_id FROM clan_data WHERE ally_id >= ? AND ally_id < ?",
"SELECT leader_id FROM clan_data WHERE leader_id >= ? AND leader_id < ?",
"SELECT item_obj_id FROM pets WHERE item_obj_id >= ? AND item_obj_id < ?",
"SELECT object_id FROM itemsonground WHERE object_id >= ? AND object_id < ?",
"SELECT summonId FROM characters_summons WHERE summonId >= ? AND summonId < ?"
};
//@formatter:off //@formatter:off
private static final String[][] ID_EXTRACTS = private static final String[][] ID_EXTRACTS =
{ {
@@ -76,21 +49,23 @@ public abstract class IdFactory
{"messages","messageId"} {"messages","messageId"}
}; };
//@formatter:on //@formatter:on
private static final String[] TIMESTAMPS_CLEAN = private static final String[] TIMESTAMPS_CLEAN =
{ {
"DELETE FROM character_instance_time WHERE time <= ?", "DELETE FROM character_instance_time WHERE time <= ?",
"DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?" "DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?"
}; };
public static final int FIRST_OID = 0x10000000;
public static final int LAST_OID = 0x7FFFFFFF; private static final int FIRST_OID = 0x10000000;
public static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID; private static final int LAST_OID = 0x7FFFFFFF;
private static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID;
private static BitSet _freeIds; private static BitSet _freeIds;
private static AtomicInteger _freeIdCount; private static AtomicInteger _freeIdCount;
private static AtomicInteger _nextFreeId; private static AtomicInteger _nextFreeId;
private static boolean _initialized; private static boolean _initialized;
public static void init() public IdManager()
{ {
// Update characters online status. // Update characters online status.
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
@@ -101,7 +76,7 @@ public abstract class IdFactory
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not update characters online status: " + e); LOGGER.warning("IdManager: Could not update characters online status: " + e);
} }
// Cleanup database. // Cleanup database.
@@ -182,11 +157,11 @@ public abstract class IdFactory
statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);"); statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);");
statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);"); statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
LOGGER.info("IdFactory: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds."); LOGGER.info("IdManager: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds.");
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not clean up database: " + e); LOGGER.warning("IdManager: Could not clean up database: " + e);
} }
} }
@@ -202,11 +177,11 @@ public abstract class IdFactory
cleanCount += statement.executeUpdate(); cleanCount += statement.executeUpdate();
} }
} }
LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database."); LOGGER.info("IdManager: Cleaned " + cleanCount + " expired timestamps from database.");
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e); LOGGER.warning("IdManager: Could not clean expired timestamps from database. " + e);
} }
// Initialize. // Initialize.
@@ -243,7 +218,7 @@ public abstract class IdFactory
final int objectId = usedObjectId - FIRST_OID; final int objectId = usedObjectId - FIRST_OID;
if (objectId < 0) if (objectId < 0)
{ {
LOGGER.warning("IdFactory: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID); LOGGER.warning("IdManager: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID);
continue; continue;
} }
_freeIds.set(usedObjectId - FIRST_OID); _freeIds.set(usedObjectId - FIRST_OID);
@@ -256,7 +231,7 @@ public abstract class IdFactory
catch (Exception e) catch (Exception e)
{ {
_initialized = false; _initialized = false;
LOGGER.severe("IdFactory: Could not be initialized properly: " + e.getMessage()); LOGGER.severe("IdManager: Could not be initialized properly: " + e.getMessage());
} }
// Schedule increase capacity task. // Schedule increase capacity task.
@@ -271,10 +246,10 @@ public abstract class IdFactory
} }
}, 30000, 30000); }, 30000, 30000);
LOGGER.info("IdFactory: " + _freeIds.size() + " id's available."); LOGGER.info("IdManager: " + _freeIds.size() + " id's available.");
} }
public synchronized static void releaseId(int objectId) public void releaseId(int objectId)
{ {
synchronized (_nextFreeId) synchronized (_nextFreeId)
{ {
@@ -285,12 +260,12 @@ public abstract class IdFactory
} }
else else
{ {
LOGGER.warning("IdFactory: Release objectID " + objectId + " failed (< " + FIRST_OID + ")"); LOGGER.warning("IdManager: Release objectID " + objectId + " failed (< " + FIRST_OID + ")");
} }
} }
} }
public synchronized static int getNextId() public int getNextId()
{ {
synchronized (_nextFreeId) synchronized (_nextFreeId)
{ {
@@ -303,7 +278,7 @@ public abstract class IdFactory
{ {
if (_freeIds.size() >= FREE_OBJECT_ID_SIZE) if (_freeIds.size() >= FREE_OBJECT_ID_SIZE)
{ {
throw new NullPointerException("IdFactory: Ran out of valid ids."); throw new NullPointerException("IdManager: Ran out of valid ids.");
} }
increaseBitSetCapacity(); increaseBitSetCapacity();
} }
@@ -313,14 +288,14 @@ public abstract class IdFactory
} }
} }
private static void increaseBitSetCapacity() private void increaseBitSetCapacity()
{ {
final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10)); final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
newBitSet.or(_freeIds); newBitSet.or(_freeIds);
_freeIds = newBitSet; _freeIds = newBitSet;
} }
private static int usedIdCount() private int usedIdCount()
{ {
return _freeIdCount.get() - FIRST_OID; return _freeIdCount.get() - FIRST_OID;
} }
@@ -334,4 +309,14 @@ public abstract class IdFactory
{ {
return _initialized; return _initialized;
} }
public static IdManager getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final IdManager INSTANCE = new IdManager();
}
} }
@@ -31,7 +31,6 @@ import java.util.logging.Logger;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.enums.MailType; import org.l2jmobius.gameserver.enums.MailType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.entity.Message; import org.l2jmobius.gameserver.model.entity.Message;
@@ -277,7 +276,7 @@ public class MailManager
} }
_messages.remove(msgId); _messages.remove(msgId);
IdFactory.releaseId(msgId); IdManager.getInstance().releaseId(msgId);
} }
/** /**
@@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.enums.PetitionState; import org.l2jmobius.gameserver.enums.PetitionState;
import org.l2jmobius.gameserver.enums.PetitionType; import org.l2jmobius.gameserver.enums.PetitionType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.PetitionManager; import org.l2jmobius.gameserver.instancemanager.PetitionManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType) public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
_type = PetitionType.values()[petitionType - 1]; _type = PetitionType.values()[petitionType - 1];
_content = petitionText; _content = petitionText;
_petitioner = petitioner; _petitioner = petitioner;
@@ -24,7 +24,7 @@ import org.l2jmobius.gameserver.handler.ActionHandler;
import org.l2jmobius.gameserver.handler.ActionShiftHandler; import org.l2jmobius.gameserver.handler.ActionShiftHandler;
import org.l2jmobius.gameserver.handler.IActionHandler; import org.l2jmobius.gameserver.handler.IActionHandler;
import org.l2jmobius.gameserver.handler.IActionShiftHandler; import org.l2jmobius.gameserver.handler.IActionShiftHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -154,8 +154,8 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
public void refreshId() public void refreshId()
{ {
World.getInstance().removeObject(this); World.getInstance().removeObject(this);
IdFactory.releaseId(getObjectId()); IdManager.getInstance().releaseId(getObjectId());
_objectId = IdFactory.getNextId(); _objectId = IdManager.getInstance().getNextId();
} }
@Override @Override
@@ -63,7 +63,7 @@ import org.l2jmobius.gameserver.enums.Team;
import org.l2jmobius.gameserver.enums.TeleportWhereType; import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
@@ -288,7 +288,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public Creature(CreatureTemplate template) public Creature(CreatureTemplate template)
{ {
this(IdFactory.getNextId(), template); this(IdManager.getInstance().getNextId(), template);
} }
/** /**
@@ -20,7 +20,7 @@ import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType; import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.actor.stat.ControllableAirShipStat; import org.l2jmobius.gameserver.model.actor.stat.ControllableAirShipStat;
import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate; import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template); super(template);
setInstanceType(InstanceType.ControllableAirShipInstance); setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId; _ownerId = ownerId;
_helmId = IdFactory.getNextId(); // not forget to release ! _helmId = IdManager.getInstance().getNextId(); // not forget to release !
} }
@Override @Override
@@ -282,8 +282,8 @@ public class ControllableAirShipInstance extends AirShipInstance
public void refreshId() public void refreshId()
{ {
super.refreshId(); super.refreshId();
IdFactory.releaseId(_helmId); IdManager.getInstance().releaseId(_helmId);
_helmId = IdFactory.getNextId(); _helmId = IdManager.getInstance().getNextId();
} }
@Override @Override
@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.actor.instance;
import org.l2jmobius.gameserver.data.xml.impl.FenceData; import org.l2jmobius.gameserver.data.xml.impl.FenceData;
import org.l2jmobius.gameserver.enums.FenceState; import org.l2jmobius.gameserver.enums.FenceState;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
@@ -44,7 +44,7 @@ public class FenceInstance extends WorldObject
public FenceInstance(int x, int y, String name, int width, int length, int height, FenceState state) public FenceInstance(int x, int y, String name, int width, int length, int height, FenceState state)
{ {
super(IdFactory.getNextId()); super(IdManager.getInstance().getNextId());
_xMin = x - (width / 2); _xMin = x - (width / 2);
_xMax = x + (width / 2); _xMax = x + (width / 2);
@@ -59,7 +59,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1]; _heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++) for (int i = 0; i < _heightFences.length; i++)
{ {
_heightFences[i] = IdFactory.getNextId(); _heightFences[i] = IdManager.getInstance().getNextId();
} }
} }
} }
@@ -106,7 +106,6 @@ import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.handler.IItemHandler; import org.l2jmobius.gameserver.handler.IItemHandler;
import org.l2jmobius.gameserver.handler.ItemHandler; import org.l2jmobius.gameserver.handler.ItemHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager; import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
@@ -115,6 +114,7 @@ import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager; import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager; import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
@@ -1149,7 +1149,7 @@ public class PlayerInstance extends Playable
*/ */
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app) private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{ {
this(IdFactory.getNextId(), template, accountName, app); this(IdManager.getInstance().getNextId(), template, accountName, app);
} }
@Override @Override
@@ -21,7 +21,7 @@ import java.util.Locale;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.util.StringUtil; import org.l2jmobius.commons.util.StringUtil;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.HistoryInfo; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.HistoryInfo;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.RaceState; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.RaceState;
@@ -160,7 +160,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0); player.setRace(0, 0);
player.setRace(1, 0); player.setRace(1, 0);
ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443); ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), 4443);
item.setCount(1); item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber()); item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket); item.setCustomType1(ticket);
@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.announce;
import java.util.Date; import java.util.Date;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.script.DateRange; import org.l2jmobius.gameserver.script.DateRange;
/** /**
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content) public EventAnnouncement(DateRange range, String content)
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
_range = range; _range = range;
_content = content; _content = content;
} }
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override @Override
public boolean deleteMe() public boolean deleteMe()
{ {
IdFactory.releaseId(_id); IdManager.getInstance().releaseId(_id);
return true; return true;
} }
@@ -24,7 +24,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
/** /**
@@ -85,7 +85,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)")) PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
ps.setInt(1, _id); ps.setInt(1, _id);
ps.setInt(2, _player1Id); ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id); ps.setInt(3, _player2Id);
@@ -24,7 +24,7 @@ import java.sql.SQLException;
import org.l2jmobius.gameserver.data.sql.impl.CharNameTable; import org.l2jmobius.gameserver.data.sql.impl.CharNameTable;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.MailType; import org.l2jmobius.gameserver.enums.MailType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.MailManager; import org.l2jmobius.gameserver.instancemanager.MailManager;
import org.l2jmobius.gameserver.model.itemcontainer.Mail; import org.l2jmobius.gameserver.model.itemcontainer.Mail;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -99,7 +99,7 @@ public class Message
*/ */
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena) public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = senderId; _senderId = senderId;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/ */
public Message(int receiverId, String subject, String content, MailType sendBySystem) public Message(int receiverId, String subject, String content, MailType sendBySystem)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = -1; _senderId = -1;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/ */
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem) public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = senderId; _senderId = senderId;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/ */
public Message(Message msg) public Message(Message msg)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = msg.getSenderId(); _senderId = msg.getSenderId();
_receiverId = msg.getSenderId(); _receiverId = msg.getSenderId();
_subject = ""; _subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType) public Message(int receiverId, ItemInstance item, MailType mailType)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = -1; _senderId = -1;
_receiverId = receiverId; _receiverId = receiverId;
_subject = ""; _subject = "";
@@ -17,7 +17,7 @@
package org.l2jmobius.gameserver.model.itemauction; package org.l2jmobius.gameserver.model.itemauction;
import org.l2jmobius.gameserver.datatables.ItemTable; import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -78,7 +78,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance() public ItemInstance createNewItemInstance()
{ {
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), _itemId);
World.getInstance().addObject(item); World.getInstance().addObject(item);
item.setCount(_itemCount); item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel()); item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
@@ -47,8 +47,8 @@ import org.l2jmobius.gameserver.enums.ItemLocation;
import org.l2jmobius.gameserver.enums.ItemSkillType; import org.l2jmobius.gameserver.enums.ItemSkillType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
import org.l2jmobius.gameserver.instancemanager.SiegeGuardManager; import org.l2jmobius.gameserver.instancemanager.SiegeGuardManager;
import org.l2jmobius.gameserver.model.DropProtection; import org.l2jmobius.gameserver.model.DropProtection;
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/ */
public ItemInstance(int itemId) public ItemInstance(int itemId)
{ {
this(IdFactory.getNextId(), itemId); this(IdManager.getInstance().getNextId(), itemId);
} }
/** /**
@@ -16,7 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model.zone; package org.l2jmobius.gameserver.model.zone;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z) protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{ {
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), itemId);
item.setCount(num); item.setCount(num);
item.spawnMe(x, y, z + 5); item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item); ZoneManager.getInstance().getDebugItems().add(item);
@@ -106,7 +106,6 @@ import org.l2jmobius.gameserver.handler.ConditionHandler;
import org.l2jmobius.gameserver.handler.DailyMissionHandler; import org.l2jmobius.gameserver.handler.DailyMissionHandler;
import org.l2jmobius.gameserver.handler.EffectHandler; import org.l2jmobius.gameserver.handler.EffectHandler;
import org.l2jmobius.gameserver.handler.SkillConditionHandler; import org.l2jmobius.gameserver.handler.SkillConditionHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.AirShipManager; import org.l2jmobius.gameserver.instancemanager.AirShipManager;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager; import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.BoatManager; import org.l2jmobius.gameserver.instancemanager.BoatManager;
@@ -125,6 +124,7 @@ import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager; import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager; import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager; import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
@@ -207,9 +207,9 @@ public class GameServer
printSection("ThreadPool"); printSection("ThreadPool");
ThreadPool.init(); ThreadPool.init();
printSection("IdFactory"); printSection("IdManager");
IdFactory.init(); IdManager.getInstance();
if (!IdFactory.hasInitialized()) if (!IdManager.hasInitialized())
{ {
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration."); LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!"); throw new Exception("Could not initialize the ID factory!");
@@ -423,7 +423,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance()); Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size()); LOGGER.info("IdManager: Free ObjectID's remaining: " + IdManager.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{ {
@@ -35,10 +35,10 @@ import org.l2jmobius.gameserver.communitybbs.Manager.ForumsBBSManager;
import org.l2jmobius.gameserver.data.xml.impl.ClanHallData; import org.l2jmobius.gameserver.data.xml.impl.ClanHallData;
import org.l2jmobius.gameserver.enums.ClanWarState; import org.l2jmobius.gameserver.enums.ClanWarState;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.ClanEntryManager; import org.l2jmobius.gameserver.instancemanager.ClanEntryManager;
import org.l2jmobius.gameserver.instancemanager.FortManager; import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.Clan;
@@ -196,7 +196,7 @@ public class ClanTable
return null; return null;
} }
final Clan clan = new Clan(IdFactory.getNextId(), clanName); final Clan clan = new Clan(IdManager.getInstance().getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player); final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader); clan.setLeader(leader);
leader.setPlayerInstance(player); leader.setPlayerInstance(player);
@@ -271,7 +271,7 @@ public class ClanTable
} }
_clans.remove(clanId); _clans.remove(clanId);
IdFactory.releaseId(clanId); IdManager.getInstance().releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection()) try (Connection con = DatabaseFactory.getConnection())
{ {
@@ -34,7 +34,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData;
import org.l2jmobius.gameserver.engines.DocumentEngine; import org.l2jmobius.gameserver.engines.DocumentEngine;
import org.l2jmobius.gameserver.enums.ItemLocation; import org.l2jmobius.gameserver.enums.ItemLocation;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
@@ -209,7 +209,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference) public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{ {
// Create and Init the ItemInstance corresponding to the Item Identifier // Create and Init the ItemInstance corresponding to the Item Identifier
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId)) if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{ {
ScheduledFuture<?> itemLootShedule; ScheduledFuture<?> itemLootShedule;
@@ -327,7 +327,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED); item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item); World.getInstance().removeObject(item);
IdFactory.releaseId(item.getObjectId()); IdManager.getInstance().releaseId(item.getObjectId());
if (Config.LOG_ITEMS) if (Config.LOG_ITEMS)
{ {
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.l2jmobius.gameserver.idfactory; package org.l2jmobius.gameserver.instancemanager;
import java.sql.Connection; import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@@ -33,39 +33,12 @@ import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.util.PrimeFinder; import org.l2jmobius.gameserver.util.PrimeFinder;
/** /**
* @author Mobius (reworked from L2J version) * @author Mobius (reworked from L2J IdFactory)
*/ */
public abstract class IdFactory public class IdManager
{ {
private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName()); private static final Logger LOGGER = Logger.getLogger(IdManager.class.getName());
protected static final String[] ID_CHECKS =
{
"SELECT owner_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT object_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT charId FROM character_quests WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_contacts WHERE charId >= ? AND charId < ?",
"SELECT contactId FROM character_contacts WHERE contactId >= ? AND contactId < ?",
"SELECT charId FROM character_friends WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_friends WHERE friendId >= ? AND friendId < ?",
"SELECT charId FROM character_hennas WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipebook WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipeshoplist WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_shortcuts WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_macroses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills_save WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_subclasses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM characters WHERE charId >= ? AND charId < ?",
"SELECT clanid FROM characters WHERE clanid >= ? AND clanid < ?",
"SELECT clan_id FROM clan_data WHERE clan_id >= ? AND clan_id < ?",
"SELECT clan_id FROM siege_clans WHERE clan_id >= ? AND clan_id < ?",
"SELECT ally_id FROM clan_data WHERE ally_id >= ? AND ally_id < ?",
"SELECT leader_id FROM clan_data WHERE leader_id >= ? AND leader_id < ?",
"SELECT item_obj_id FROM pets WHERE item_obj_id >= ? AND item_obj_id < ?",
"SELECT object_id FROM itemsonground WHERE object_id >= ? AND object_id < ?",
"SELECT summonId FROM characters_summons WHERE summonId >= ? AND summonId < ?"
};
//@formatter:off //@formatter:off
private static final String[][] ID_EXTRACTS = private static final String[][] ID_EXTRACTS =
{ {
@@ -76,21 +49,23 @@ public abstract class IdFactory
{"messages","messageId"} {"messages","messageId"}
}; };
//@formatter:on //@formatter:on
private static final String[] TIMESTAMPS_CLEAN = private static final String[] TIMESTAMPS_CLEAN =
{ {
"DELETE FROM character_instance_time WHERE time <= ?", "DELETE FROM character_instance_time WHERE time <= ?",
"DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?" "DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?"
}; };
public static final int FIRST_OID = 0x10000000;
public static final int LAST_OID = 0x7FFFFFFF; private static final int FIRST_OID = 0x10000000;
public static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID; private static final int LAST_OID = 0x7FFFFFFF;
private static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID;
private static BitSet _freeIds; private static BitSet _freeIds;
private static AtomicInteger _freeIdCount; private static AtomicInteger _freeIdCount;
private static AtomicInteger _nextFreeId; private static AtomicInteger _nextFreeId;
private static boolean _initialized; private static boolean _initialized;
public static void init() public IdManager()
{ {
// Update characters online status. // Update characters online status.
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
@@ -101,7 +76,7 @@ public abstract class IdFactory
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not update characters online status: " + e); LOGGER.warning("IdManager: Could not update characters online status: " + e);
} }
// Cleanup database. // Cleanup database.
@@ -182,11 +157,11 @@ public abstract class IdFactory
statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);"); statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);");
statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);"); statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
LOGGER.info("IdFactory: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds."); LOGGER.info("IdManager: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds.");
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not clean up database: " + e); LOGGER.warning("IdManager: Could not clean up database: " + e);
} }
} }
@@ -202,11 +177,11 @@ public abstract class IdFactory
cleanCount += statement.executeUpdate(); cleanCount += statement.executeUpdate();
} }
} }
LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database."); LOGGER.info("IdManager: Cleaned " + cleanCount + " expired timestamps from database.");
} }
catch (Exception e) catch (Exception e)
{ {
LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e); LOGGER.warning("IdManager: Could not clean expired timestamps from database. " + e);
} }
// Initialize. // Initialize.
@@ -243,7 +218,7 @@ public abstract class IdFactory
final int objectId = usedObjectId - FIRST_OID; final int objectId = usedObjectId - FIRST_OID;
if (objectId < 0) if (objectId < 0)
{ {
LOGGER.warning("IdFactory: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID); LOGGER.warning("IdManager: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID);
continue; continue;
} }
_freeIds.set(usedObjectId - FIRST_OID); _freeIds.set(usedObjectId - FIRST_OID);
@@ -256,7 +231,7 @@ public abstract class IdFactory
catch (Exception e) catch (Exception e)
{ {
_initialized = false; _initialized = false;
LOGGER.severe("IdFactory: Could not be initialized properly: " + e.getMessage()); LOGGER.severe("IdManager: Could not be initialized properly: " + e.getMessage());
} }
// Schedule increase capacity task. // Schedule increase capacity task.
@@ -271,10 +246,10 @@ public abstract class IdFactory
} }
}, 30000, 30000); }, 30000, 30000);
LOGGER.info("IdFactory: " + _freeIds.size() + " id's available."); LOGGER.info("IdManager: " + _freeIds.size() + " id's available.");
} }
public synchronized static void releaseId(int objectId) public void releaseId(int objectId)
{ {
synchronized (_nextFreeId) synchronized (_nextFreeId)
{ {
@@ -285,12 +260,12 @@ public abstract class IdFactory
} }
else else
{ {
LOGGER.warning("IdFactory: Release objectID " + objectId + " failed (< " + FIRST_OID + ")"); LOGGER.warning("IdManager: Release objectID " + objectId + " failed (< " + FIRST_OID + ")");
} }
} }
} }
public synchronized static int getNextId() public int getNextId()
{ {
synchronized (_nextFreeId) synchronized (_nextFreeId)
{ {
@@ -303,7 +278,7 @@ public abstract class IdFactory
{ {
if (_freeIds.size() >= FREE_OBJECT_ID_SIZE) if (_freeIds.size() >= FREE_OBJECT_ID_SIZE)
{ {
throw new NullPointerException("IdFactory: Ran out of valid ids."); throw new NullPointerException("IdManager: Ran out of valid ids.");
} }
increaseBitSetCapacity(); increaseBitSetCapacity();
} }
@@ -313,14 +288,14 @@ public abstract class IdFactory
} }
} }
private static void increaseBitSetCapacity() private void increaseBitSetCapacity()
{ {
final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10)); final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
newBitSet.or(_freeIds); newBitSet.or(_freeIds);
_freeIds = newBitSet; _freeIds = newBitSet;
} }
private static int usedIdCount() private int usedIdCount()
{ {
return _freeIdCount.get() - FIRST_OID; return _freeIdCount.get() - FIRST_OID;
} }
@@ -334,4 +309,14 @@ public abstract class IdFactory
{ {
return _initialized; return _initialized;
} }
public static IdManager getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final IdManager INSTANCE = new IdManager();
}
} }
@@ -31,7 +31,6 @@ import java.util.logging.Logger;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.enums.MailType; import org.l2jmobius.gameserver.enums.MailType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.entity.Message; import org.l2jmobius.gameserver.model.entity.Message;
@@ -277,7 +276,7 @@ public class MailManager
} }
_messages.remove(msgId); _messages.remove(msgId);
IdFactory.releaseId(msgId); IdManager.getInstance().releaseId(msgId);
} }
/** /**
@@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.enums.PetitionState; import org.l2jmobius.gameserver.enums.PetitionState;
import org.l2jmobius.gameserver.enums.PetitionType; import org.l2jmobius.gameserver.enums.PetitionType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.PetitionManager; import org.l2jmobius.gameserver.instancemanager.PetitionManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType) public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
_type = PetitionType.values()[petitionType - 1]; _type = PetitionType.values()[petitionType - 1];
_content = petitionText; _content = petitionText;
_petitioner = petitioner; _petitioner = petitioner;
@@ -24,7 +24,7 @@ import org.l2jmobius.gameserver.handler.ActionHandler;
import org.l2jmobius.gameserver.handler.ActionShiftHandler; import org.l2jmobius.gameserver.handler.ActionShiftHandler;
import org.l2jmobius.gameserver.handler.IActionHandler; import org.l2jmobius.gameserver.handler.IActionHandler;
import org.l2jmobius.gameserver.handler.IActionShiftHandler; import org.l2jmobius.gameserver.handler.IActionShiftHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -154,8 +154,8 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
public void refreshId() public void refreshId()
{ {
World.getInstance().removeObject(this); World.getInstance().removeObject(this);
IdFactory.releaseId(getObjectId()); IdManager.getInstance().releaseId(getObjectId());
_objectId = IdFactory.getNextId(); _objectId = IdManager.getInstance().getNextId();
} }
@Override @Override
@@ -63,7 +63,7 @@ import org.l2jmobius.gameserver.enums.Team;
import org.l2jmobius.gameserver.enums.TeleportWhereType; import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
@@ -288,7 +288,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public Creature(CreatureTemplate template) public Creature(CreatureTemplate template)
{ {
this(IdFactory.getNextId(), template); this(IdManager.getInstance().getNextId(), template);
} }
/** /**
@@ -20,7 +20,7 @@ import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType; import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.actor.stat.ControllableAirShipStat; import org.l2jmobius.gameserver.model.actor.stat.ControllableAirShipStat;
import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate; import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template); super(template);
setInstanceType(InstanceType.ControllableAirShipInstance); setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId; _ownerId = ownerId;
_helmId = IdFactory.getNextId(); // not forget to release ! _helmId = IdManager.getInstance().getNextId(); // not forget to release !
} }
@Override @Override
@@ -282,8 +282,8 @@ public class ControllableAirShipInstance extends AirShipInstance
public void refreshId() public void refreshId()
{ {
super.refreshId(); super.refreshId();
IdFactory.releaseId(_helmId); IdManager.getInstance().releaseId(_helmId);
_helmId = IdFactory.getNextId(); _helmId = IdManager.getInstance().getNextId();
} }
@Override @Override
@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.actor.instance;
import org.l2jmobius.gameserver.data.xml.impl.FenceData; import org.l2jmobius.gameserver.data.xml.impl.FenceData;
import org.l2jmobius.gameserver.enums.FenceState; import org.l2jmobius.gameserver.enums.FenceState;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
@@ -44,7 +44,7 @@ public class FenceInstance extends WorldObject
public FenceInstance(int x, int y, String name, int width, int length, int height, FenceState state) public FenceInstance(int x, int y, String name, int width, int length, int height, FenceState state)
{ {
super(IdFactory.getNextId()); super(IdManager.getInstance().getNextId());
_xMin = x - (width / 2); _xMin = x - (width / 2);
_xMax = x + (width / 2); _xMax = x + (width / 2);
@@ -59,7 +59,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1]; _heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++) for (int i = 0; i < _heightFences.length; i++)
{ {
_heightFences[i] = IdFactory.getNextId(); _heightFences[i] = IdManager.getInstance().getNextId();
} }
} }
} }
@@ -107,7 +107,6 @@ import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.handler.IItemHandler; import org.l2jmobius.gameserver.handler.IItemHandler;
import org.l2jmobius.gameserver.handler.ItemHandler; import org.l2jmobius.gameserver.handler.ItemHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager; import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
@@ -116,6 +115,7 @@ import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager; import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager; import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
@@ -1159,7 +1159,7 @@ public class PlayerInstance extends Playable
*/ */
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app) private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{ {
this(IdFactory.getNextId(), template, accountName, app); this(IdManager.getInstance().getNextId(), template, accountName, app);
} }
@Override @Override
@@ -21,7 +21,7 @@ import java.util.Locale;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.util.StringUtil; import org.l2jmobius.commons.util.StringUtil;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.HistoryInfo; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.HistoryInfo;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.RaceState; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.RaceState;
@@ -160,7 +160,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0); player.setRace(0, 0);
player.setRace(1, 0); player.setRace(1, 0);
ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443); ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), 4443);
item.setCount(1); item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber()); item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket); item.setCustomType1(ticket);
@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.announce;
import java.util.Date; import java.util.Date;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.script.DateRange; import org.l2jmobius.gameserver.script.DateRange;
/** /**
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content) public EventAnnouncement(DateRange range, String content)
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
_range = range; _range = range;
_content = content; _content = content;
} }
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override @Override
public boolean deleteMe() public boolean deleteMe()
{ {
IdFactory.releaseId(_id); IdManager.getInstance().releaseId(_id);
return true; return true;
} }
@@ -24,7 +24,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
/** /**
@@ -85,7 +85,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)")) PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
ps.setInt(1, _id); ps.setInt(1, _id);
ps.setInt(2, _player1Id); ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id); ps.setInt(3, _player2Id);
@@ -24,7 +24,7 @@ import java.sql.SQLException;
import org.l2jmobius.gameserver.data.sql.impl.CharNameTable; import org.l2jmobius.gameserver.data.sql.impl.CharNameTable;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.MailType; import org.l2jmobius.gameserver.enums.MailType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.MailManager; import org.l2jmobius.gameserver.instancemanager.MailManager;
import org.l2jmobius.gameserver.model.itemcontainer.Mail; import org.l2jmobius.gameserver.model.itemcontainer.Mail;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -99,7 +99,7 @@ public class Message
*/ */
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena) public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = senderId; _senderId = senderId;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/ */
public Message(int receiverId, String subject, String content, MailType sendBySystem) public Message(int receiverId, String subject, String content, MailType sendBySystem)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = -1; _senderId = -1;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/ */
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem) public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = senderId; _senderId = senderId;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/ */
public Message(Message msg) public Message(Message msg)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = msg.getSenderId(); _senderId = msg.getSenderId();
_receiverId = msg.getSenderId(); _receiverId = msg.getSenderId();
_subject = ""; _subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType) public Message(int receiverId, ItemInstance item, MailType mailType)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = -1; _senderId = -1;
_receiverId = receiverId; _receiverId = receiverId;
_subject = ""; _subject = "";
@@ -17,7 +17,7 @@
package org.l2jmobius.gameserver.model.itemauction; package org.l2jmobius.gameserver.model.itemauction;
import org.l2jmobius.gameserver.datatables.ItemTable; import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -78,7 +78,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance() public ItemInstance createNewItemInstance()
{ {
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), _itemId);
World.getInstance().addObject(item); World.getInstance().addObject(item);
item.setCount(_itemCount); item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel()); item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
@@ -47,8 +47,8 @@ import org.l2jmobius.gameserver.enums.ItemLocation;
import org.l2jmobius.gameserver.enums.ItemSkillType; import org.l2jmobius.gameserver.enums.ItemSkillType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
import org.l2jmobius.gameserver.instancemanager.SiegeGuardManager; import org.l2jmobius.gameserver.instancemanager.SiegeGuardManager;
import org.l2jmobius.gameserver.model.DropProtection; import org.l2jmobius.gameserver.model.DropProtection;
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/ */
public ItemInstance(int itemId) public ItemInstance(int itemId)
{ {
this(IdFactory.getNextId(), itemId); this(IdManager.getInstance().getNextId(), itemId);
} }
/** /**
@@ -16,7 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model.zone; package org.l2jmobius.gameserver.model.zone;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z) protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{ {
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), itemId);
item.setCount(num); item.setCount(num);
item.spawnMe(x, y, z + 5); item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item); ZoneManager.getInstance().getDebugItems().add(item);
@@ -107,7 +107,6 @@ import org.l2jmobius.gameserver.handler.ConditionHandler;
import org.l2jmobius.gameserver.handler.DailyMissionHandler; import org.l2jmobius.gameserver.handler.DailyMissionHandler;
import org.l2jmobius.gameserver.handler.EffectHandler; import org.l2jmobius.gameserver.handler.EffectHandler;
import org.l2jmobius.gameserver.handler.SkillConditionHandler; import org.l2jmobius.gameserver.handler.SkillConditionHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.AirShipManager; import org.l2jmobius.gameserver.instancemanager.AirShipManager;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager; import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.BoatManager; import org.l2jmobius.gameserver.instancemanager.BoatManager;
@@ -126,6 +125,7 @@ import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager; import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager; import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager; import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
@@ -208,9 +208,9 @@ public class GameServer
printSection("ThreadPool"); printSection("ThreadPool");
ThreadPool.init(); ThreadPool.init();
printSection("IdFactory"); printSection("IdManager");
IdFactory.init(); IdManager.getInstance();
if (!IdFactory.hasInitialized()) if (!IdManager.hasInitialized())
{ {
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration."); LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!"); throw new Exception("Could not initialize the ID factory!");
@@ -425,7 +425,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance()); Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size()); LOGGER.info("IdManager: Free ObjectID's remaining: " + IdManager.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{ {
@@ -35,10 +35,10 @@ import org.l2jmobius.gameserver.communitybbs.Manager.ForumsBBSManager;
import org.l2jmobius.gameserver.data.xml.impl.ClanHallData; import org.l2jmobius.gameserver.data.xml.impl.ClanHallData;
import org.l2jmobius.gameserver.enums.ClanWarState; import org.l2jmobius.gameserver.enums.ClanWarState;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.ClanEntryManager; import org.l2jmobius.gameserver.instancemanager.ClanEntryManager;
import org.l2jmobius.gameserver.instancemanager.FortManager; import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.Clan;
@@ -196,7 +196,7 @@ public class ClanTable
return null; return null;
} }
final Clan clan = new Clan(IdFactory.getNextId(), clanName); final Clan clan = new Clan(IdManager.getInstance().getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player); final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader); clan.setLeader(leader);
leader.setPlayerInstance(player); leader.setPlayerInstance(player);
@@ -271,7 +271,7 @@ public class ClanTable
} }
_clans.remove(clanId); _clans.remove(clanId);
IdFactory.releaseId(clanId); IdManager.getInstance().releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection()) try (Connection con = DatabaseFactory.getConnection())
{ {
@@ -34,7 +34,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData;
import org.l2jmobius.gameserver.engines.DocumentEngine; import org.l2jmobius.gameserver.engines.DocumentEngine;
import org.l2jmobius.gameserver.enums.ItemLocation; import org.l2jmobius.gameserver.enums.ItemLocation;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
@@ -210,7 +210,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference) public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{ {
// Create and Init the ItemInstance corresponding to the Item Identifier // Create and Init the ItemInstance corresponding to the Item Identifier
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId)) if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{ {
ScheduledFuture<?> itemLootShedule; ScheduledFuture<?> itemLootShedule;
@@ -328,7 +328,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED); item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item); World.getInstance().removeObject(item);
IdFactory.releaseId(item.getObjectId()); IdManager.getInstance().releaseId(item.getObjectId());
if (Config.LOG_ITEMS) if (Config.LOG_ITEMS)
{ {
@@ -1,337 +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.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.util.PrimeFinder;
/**
* @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
"SELECT owner_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT object_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT charId FROM character_quests WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_contacts WHERE charId >= ? AND charId < ?",
"SELECT contactId FROM character_contacts WHERE contactId >= ? AND contactId < ?",
"SELECT charId FROM character_friends WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_friends WHERE friendId >= ? AND friendId < ?",
"SELECT charId FROM character_hennas WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipebook WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipeshoplist WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_shortcuts WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_macroses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills_save WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_subclasses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM characters WHERE charId >= ? AND charId < ?",
"SELECT clanid FROM characters WHERE clanid >= ? AND clanid < ?",
"SELECT clan_id FROM clan_data WHERE clan_id >= ? AND clan_id < ?",
"SELECT clan_id FROM siege_clans WHERE clan_id >= ? AND clan_id < ?",
"SELECT ally_id FROM clan_data WHERE ally_id >= ? AND ally_id < ?",
"SELECT leader_id FROM clan_data WHERE leader_id >= ? AND leader_id < ?",
"SELECT item_obj_id FROM pets WHERE item_obj_id >= ? AND item_obj_id < ?",
"SELECT object_id FROM itemsonground WHERE object_id >= ? AND object_id < ?",
"SELECT summonId FROM characters_summons WHERE summonId >= ? AND summonId < ?"
};
//@formatter:off
private static final String[][] ID_EXTRACTS =
{
{"characters","charId"},
{"items","object_id"},
{"clan_data","clan_id"},
{"itemsonground","object_id"},
{"messages","messageId"}
};
//@formatter:on
private static final String[] TIMESTAMPS_CLEAN =
{
"DELETE FROM character_instance_time WHERE time <= ?",
"DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?"
};
public static final int FIRST_OID = 0x10000000;
public static final int LAST_OID = 0x7FFFFFFF;
public static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID;
private static BitSet _freeIds;
private static AtomicInteger _freeIdCount;
private static AtomicInteger _nextFreeId;
private static boolean _initialized;
public static void init()
{
// Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
statement.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
catch (Exception e)
{
LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
// Cleanup database.
if (Config.DATABASE_CLEAN_UP)
{
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
final long cleanupStart = System.currentTimeMillis();
int cleanCount = 0;
// Characters
cleanCount += statement.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
// Items
cleanCount += statement.executeUpdate("DELETE FROM items WHERE items.owner_id NOT IN (SELECT charId FROM characters) AND items.owner_id NOT IN (SELECT clan_id FROM clan_data) AND items.owner_id != -1;");
cleanCount += statement.executeUpdate("DELETE FROM items WHERE items.owner_id = -1 AND loc LIKE 'MAIL' AND loc_data NOT IN (SELECT messageId FROM messages WHERE senderId = -1);");
cleanCount += statement.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
// Misc
cleanCount += statement.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
// Clan
cleanCount += statement.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
// Forums
cleanCount += statement.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
cleanCount += statement.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
cleanCount += statement.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
cleanCount += statement.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
// Update needed items after cleaning has taken place.
statement.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
statement.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
statement.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
statement.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);");
statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
LOGGER.info("IdFactory: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds.");
}
catch (Exception e)
{
LOGGER.warning("IdFactory: Could not clean up database: " + e);
}
}
// Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
for (String line : TIMESTAMPS_CLEAN)
{
try (PreparedStatement statement = con.prepareStatement(line))
{
statement.setLong(1, System.currentTimeMillis());
cleanCount += statement.executeUpdate();
}
}
LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
catch (Exception e)
{
LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
// Initialize.
try
{
_freeIds = new BitSet(PrimeFinder.nextPrime(100000));
_freeIds.clear();
_freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
// Collect already used ids.
final List<Integer> usedIds = new ArrayList<>();
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
String extractUsedObjectIdsQuery = "";
for (String[] tblClmn : ID_EXTRACTS)
{
extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
}
extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
try (ResultSet result = statement.executeQuery(extractUsedObjectIdsQuery))
{
while (result.next())
{
usedIds.add(result.getInt(1));
}
}
}
Collections.sort(usedIds);
// Register used ids.
for (int usedObjectId : usedIds)
{
final int objectId = usedObjectId - FIRST_OID;
if (objectId < 0)
{
LOGGER.warning("IdFactory: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID);
continue;
}
_freeIds.set(usedObjectId - FIRST_OID);
_freeIdCount.decrementAndGet();
}
_nextFreeId = new AtomicInteger(_freeIds.nextClearBit(0));
_initialized = true;
}
catch (Exception e)
{
_initialized = false;
LOGGER.severe("IdFactory: Could not be initialized properly: " + e.getMessage());
}
// Schedule increase capacity task.
ThreadPool.scheduleAtFixedRate(() ->
{
synchronized (_nextFreeId)
{
if (PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size())
{
increaseBitSetCapacity();
}
}
}, 30000, 30000);
LOGGER.info("IdFactory: " + _freeIds.size() + " id's available.");
}
public synchronized static void releaseId(int objectId)
{
synchronized (_nextFreeId)
{
if ((objectId - FIRST_OID) > -1)
{
_freeIds.clear(objectId - FIRST_OID);
_freeIdCount.incrementAndGet();
}
else
{
LOGGER.warning("IdFactory: Release objectID " + objectId + " failed (< " + FIRST_OID + ")");
}
}
}
public synchronized static int getNextId()
{
synchronized (_nextFreeId)
{
final int newId = _nextFreeId.get();
_freeIds.set(newId);
_freeIdCount.decrementAndGet();
final int nextFree = _freeIds.nextClearBit(newId) < 0 ? _freeIds.nextClearBit(0) : _freeIds.nextClearBit(newId);
if (nextFree < 0)
{
if (_freeIds.size() >= FREE_OBJECT_ID_SIZE)
{
throw new NullPointerException("IdFactory: Ran out of valid ids.");
}
increaseBitSetCapacity();
}
_nextFreeId.set(nextFree);
return newId + FIRST_OID;
}
}
private static void increaseBitSetCapacity()
{
final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
newBitSet.or(_freeIds);
_freeIds = newBitSet;
}
private static int usedIdCount()
{
return _freeIdCount.get() - FIRST_OID;
}
public static int size()
{
return _freeIdCount.get();
}
public static boolean hasInitialized()
{
return _initialized;
}
}
@@ -0,0 +1,322 @@
/*
* 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.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.util.PrimeFinder;
/**
* @author Mobius (reworked from L2J IdFactory)
*/
public class IdManager
{
private static final Logger LOGGER = Logger.getLogger(IdManager.class.getName());
//@formatter:off
private static final String[][] ID_EXTRACTS =
{
{"characters","charId"},
{"items","object_id"},
{"clan_data","clan_id"},
{"itemsonground","object_id"},
{"messages","messageId"}
};
//@formatter:on
private static final String[] TIMESTAMPS_CLEAN =
{
"DELETE FROM character_instance_time WHERE time <= ?",
"DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?"
};
private static final int FIRST_OID = 0x10000000;
private static final int LAST_OID = 0x7FFFFFFF;
private static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID;
private static BitSet _freeIds;
private static AtomicInteger _freeIdCount;
private static AtomicInteger _nextFreeId;
private static boolean _initialized;
public IdManager()
{
// Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
statement.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
catch (Exception e)
{
LOGGER.warning("IdManager: Could not update characters online status: " + e);
}
// Cleanup database.
if (Config.DATABASE_CLEAN_UP)
{
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
final long cleanupStart = System.currentTimeMillis();
int cleanCount = 0;
// Characters
cleanCount += statement.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
// Items
cleanCount += statement.executeUpdate("DELETE FROM items WHERE items.owner_id NOT IN (SELECT charId FROM characters) AND items.owner_id NOT IN (SELECT clan_id FROM clan_data) AND items.owner_id != -1;");
cleanCount += statement.executeUpdate("DELETE FROM items WHERE items.owner_id = -1 AND loc LIKE 'MAIL' AND loc_data NOT IN (SELECT messageId FROM messages WHERE senderId = -1);");
cleanCount += statement.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
// Misc
cleanCount += statement.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
// Clan
cleanCount += statement.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
// Forums
cleanCount += statement.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
cleanCount += statement.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
cleanCount += statement.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
cleanCount += statement.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
// Update needed items after cleaning has taken place.
statement.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
statement.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
statement.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
statement.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);");
statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
LOGGER.info("IdManager: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds.");
}
catch (Exception e)
{
LOGGER.warning("IdManager: Could not clean up database: " + e);
}
}
// Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
for (String line : TIMESTAMPS_CLEAN)
{
try (PreparedStatement statement = con.prepareStatement(line))
{
statement.setLong(1, System.currentTimeMillis());
cleanCount += statement.executeUpdate();
}
}
LOGGER.info("IdManager: Cleaned " + cleanCount + " expired timestamps from database.");
}
catch (Exception e)
{
LOGGER.warning("IdManager: Could not clean expired timestamps from database. " + e);
}
// Initialize.
try
{
_freeIds = new BitSet(PrimeFinder.nextPrime(100000));
_freeIds.clear();
_freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
// Collect already used ids.
final List<Integer> usedIds = new ArrayList<>();
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
String extractUsedObjectIdsQuery = "";
for (String[] tblClmn : ID_EXTRACTS)
{
extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
}
extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
try (ResultSet result = statement.executeQuery(extractUsedObjectIdsQuery))
{
while (result.next())
{
usedIds.add(result.getInt(1));
}
}
}
Collections.sort(usedIds);
// Register used ids.
for (int usedObjectId : usedIds)
{
final int objectId = usedObjectId - FIRST_OID;
if (objectId < 0)
{
LOGGER.warning("IdManager: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID);
continue;
}
_freeIds.set(usedObjectId - FIRST_OID);
_freeIdCount.decrementAndGet();
}
_nextFreeId = new AtomicInteger(_freeIds.nextClearBit(0));
_initialized = true;
}
catch (Exception e)
{
_initialized = false;
LOGGER.severe("IdManager: Could not be initialized properly: " + e.getMessage());
}
// Schedule increase capacity task.
ThreadPool.scheduleAtFixedRate(() ->
{
synchronized (_nextFreeId)
{
if (PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size())
{
increaseBitSetCapacity();
}
}
}, 30000, 30000);
LOGGER.info("IdManager: " + _freeIds.size() + " id's available.");
}
public void releaseId(int objectId)
{
synchronized (_nextFreeId)
{
if ((objectId - FIRST_OID) > -1)
{
_freeIds.clear(objectId - FIRST_OID);
_freeIdCount.incrementAndGet();
}
else
{
LOGGER.warning("IdManager: Release objectID " + objectId + " failed (< " + FIRST_OID + ")");
}
}
}
public int getNextId()
{
synchronized (_nextFreeId)
{
final int newId = _nextFreeId.get();
_freeIds.set(newId);
_freeIdCount.decrementAndGet();
final int nextFree = _freeIds.nextClearBit(newId) < 0 ? _freeIds.nextClearBit(0) : _freeIds.nextClearBit(newId);
if (nextFree < 0)
{
if (_freeIds.size() >= FREE_OBJECT_ID_SIZE)
{
throw new NullPointerException("IdManager: Ran out of valid ids.");
}
increaseBitSetCapacity();
}
_nextFreeId.set(nextFree);
return newId + FIRST_OID;
}
}
private void increaseBitSetCapacity()
{
final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
newBitSet.or(_freeIds);
_freeIds = newBitSet;
}
private int usedIdCount()
{
return _freeIdCount.get() - FIRST_OID;
}
public static int size()
{
return _freeIdCount.get();
}
public static boolean hasInitialized()
{
return _initialized;
}
public static IdManager getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final IdManager INSTANCE = new IdManager();
}
}
@@ -31,7 +31,6 @@ import java.util.logging.Logger;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.enums.MailType; import org.l2jmobius.gameserver.enums.MailType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.entity.Message; import org.l2jmobius.gameserver.model.entity.Message;
@@ -277,7 +276,7 @@ public class MailManager
} }
_messages.remove(msgId); _messages.remove(msgId);
IdFactory.releaseId(msgId); IdManager.getInstance().releaseId(msgId);
} }
/** /**
@@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.enums.PetitionState; import org.l2jmobius.gameserver.enums.PetitionState;
import org.l2jmobius.gameserver.enums.PetitionType; import org.l2jmobius.gameserver.enums.PetitionType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.PetitionManager; import org.l2jmobius.gameserver.instancemanager.PetitionManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType) public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
_type = PetitionType.values()[petitionType - 1]; _type = PetitionType.values()[petitionType - 1];
_content = petitionText; _content = petitionText;
_petitioner = petitioner; _petitioner = petitioner;
@@ -24,7 +24,7 @@ import org.l2jmobius.gameserver.handler.ActionHandler;
import org.l2jmobius.gameserver.handler.ActionShiftHandler; import org.l2jmobius.gameserver.handler.ActionShiftHandler;
import org.l2jmobius.gameserver.handler.IActionHandler; import org.l2jmobius.gameserver.handler.IActionHandler;
import org.l2jmobius.gameserver.handler.IActionShiftHandler; import org.l2jmobius.gameserver.handler.IActionShiftHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -154,8 +154,8 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
public void refreshId() public void refreshId()
{ {
World.getInstance().removeObject(this); World.getInstance().removeObject(this);
IdFactory.releaseId(getObjectId()); IdManager.getInstance().releaseId(getObjectId());
_objectId = IdFactory.getNextId(); _objectId = IdManager.getInstance().getNextId();
} }
@Override @Override
@@ -63,7 +63,7 @@ import org.l2jmobius.gameserver.enums.Team;
import org.l2jmobius.gameserver.enums.TeleportWhereType; import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
@@ -288,7 +288,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public Creature(CreatureTemplate template) public Creature(CreatureTemplate template)
{ {
this(IdFactory.getNextId(), template); this(IdManager.getInstance().getNextId(), template);
} }
/** /**
@@ -20,7 +20,7 @@ import java.util.concurrent.Future;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.enums.InstanceType; import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.actor.stat.ControllableAirShipStat; import org.l2jmobius.gameserver.model.actor.stat.ControllableAirShipStat;
import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate; import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template); super(template);
setInstanceType(InstanceType.ControllableAirShipInstance); setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId; _ownerId = ownerId;
_helmId = IdFactory.getNextId(); // not forget to release ! _helmId = IdManager.getInstance().getNextId(); // not forget to release !
} }
@Override @Override
@@ -282,8 +282,8 @@ public class ControllableAirShipInstance extends AirShipInstance
public void refreshId() public void refreshId()
{ {
super.refreshId(); super.refreshId();
IdFactory.releaseId(_helmId); IdManager.getInstance().releaseId(_helmId);
_helmId = IdFactory.getNextId(); _helmId = IdManager.getInstance().getNextId();
} }
@Override @Override
@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.actor.instance;
import org.l2jmobius.gameserver.data.xml.impl.FenceData; import org.l2jmobius.gameserver.data.xml.impl.FenceData;
import org.l2jmobius.gameserver.enums.FenceState; import org.l2jmobius.gameserver.enums.FenceState;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
@@ -44,7 +44,7 @@ public class FenceInstance extends WorldObject
public FenceInstance(int x, int y, String name, int width, int length, int height, FenceState state) public FenceInstance(int x, int y, String name, int width, int length, int height, FenceState state)
{ {
super(IdFactory.getNextId()); super(IdManager.getInstance().getNextId());
_xMin = x - (width / 2); _xMin = x - (width / 2);
_xMax = x + (width / 2); _xMax = x + (width / 2);
@@ -59,7 +59,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1]; _heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++) for (int i = 0; i < _heightFences.length; i++)
{ {
_heightFences[i] = IdFactory.getNextId(); _heightFences[i] = IdManager.getInstance().getNextId();
} }
} }
} }
@@ -107,7 +107,6 @@ import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.handler.IItemHandler; import org.l2jmobius.gameserver.handler.IItemHandler;
import org.l2jmobius.gameserver.handler.ItemHandler; import org.l2jmobius.gameserver.handler.ItemHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager; import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
@@ -116,6 +115,7 @@ import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager; import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager; import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
@@ -1152,7 +1152,7 @@ public class PlayerInstance extends Playable
*/ */
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app) private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{ {
this(IdFactory.getNextId(), template, accountName, app); this(IdManager.getInstance().getNextId(), template, accountName, app);
} }
@Override @Override
@@ -21,7 +21,7 @@ import java.util.Locale;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.util.StringUtil; import org.l2jmobius.commons.util.StringUtil;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.HistoryInfo; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.HistoryInfo;
import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.RaceState; import org.l2jmobius.gameserver.instancemanager.games.MonsterRace.RaceState;
@@ -160,7 +160,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0); player.setRace(0, 0);
player.setRace(1, 0); player.setRace(1, 0);
ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443); ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), 4443);
item.setCount(1); item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber()); item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket); item.setCustomType1(ticket);
@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.model.announce;
import java.util.Date; import java.util.Date;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.script.DateRange; import org.l2jmobius.gameserver.script.DateRange;
/** /**
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content) public EventAnnouncement(DateRange range, String content)
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
_range = range; _range = range;
_content = content; _content = content;
} }
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override @Override
public boolean deleteMe() public boolean deleteMe()
{ {
IdFactory.releaseId(_id); IdManager.getInstance().releaseId(_id);
return true; return true;
} }
@@ -24,7 +24,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
/** /**
@@ -85,7 +85,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection(); try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)")) PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
ps.setInt(1, _id); ps.setInt(1, _id);
ps.setInt(2, _player1Id); ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id); ps.setInt(3, _player2Id);
@@ -24,7 +24,7 @@ import java.sql.SQLException;
import org.l2jmobius.gameserver.data.sql.impl.CharNameTable; import org.l2jmobius.gameserver.data.sql.impl.CharNameTable;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.MailType; import org.l2jmobius.gameserver.enums.MailType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.MailManager; import org.l2jmobius.gameserver.instancemanager.MailManager;
import org.l2jmobius.gameserver.model.itemcontainer.Mail; import org.l2jmobius.gameserver.model.itemcontainer.Mail;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -99,7 +99,7 @@ public class Message
*/ */
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena) public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = senderId; _senderId = senderId;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/ */
public Message(int receiverId, String subject, String content, MailType sendBySystem) public Message(int receiverId, String subject, String content, MailType sendBySystem)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = -1; _senderId = -1;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/ */
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem) public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = senderId; _senderId = senderId;
_receiverId = receiverId; _receiverId = receiverId;
_subject = subject; _subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/ */
public Message(Message msg) public Message(Message msg)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = msg.getSenderId(); _senderId = msg.getSenderId();
_receiverId = msg.getSenderId(); _receiverId = msg.getSenderId();
_subject = ""; _subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType) public Message(int receiverId, ItemInstance item, MailType mailType)
{ {
_messageId = IdFactory.getNextId(); _messageId = IdManager.getInstance().getNextId();
_senderId = -1; _senderId = -1;
_receiverId = receiverId; _receiverId = receiverId;
_subject = ""; _subject = "";
@@ -17,7 +17,7 @@
package org.l2jmobius.gameserver.model.itemauction; package org.l2jmobius.gameserver.model.itemauction;
import org.l2jmobius.gameserver.datatables.ItemTable; import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -78,7 +78,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance() public ItemInstance createNewItemInstance()
{ {
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), _itemId);
World.getInstance().addObject(item); World.getInstance().addObject(item);
item.setCount(_itemCount); item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel()); item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
@@ -47,8 +47,8 @@ import org.l2jmobius.gameserver.enums.ItemLocation;
import org.l2jmobius.gameserver.enums.ItemSkillType; import org.l2jmobius.gameserver.enums.ItemSkillType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
import org.l2jmobius.gameserver.instancemanager.SiegeGuardManager; import org.l2jmobius.gameserver.instancemanager.SiegeGuardManager;
import org.l2jmobius.gameserver.model.DropProtection; import org.l2jmobius.gameserver.model.DropProtection;
@@ -262,7 +262,7 @@ public class ItemInstance extends WorldObject
*/ */
public ItemInstance(int itemId) public ItemInstance(int itemId)
{ {
this(IdFactory.getNextId(), itemId); this(IdManager.getInstance().getNextId(), itemId);
} }
/** /**
@@ -16,7 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model.zone; package org.l2jmobius.gameserver.model.zone;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z) protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{ {
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), itemId);
item.setCount(num); item.setCount(num);
item.spawnMe(x, y, z + 5); item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item); ZoneManager.getInstance().getDebugItems().add(item);
@@ -107,7 +107,6 @@ import org.l2jmobius.gameserver.handler.ConditionHandler;
import org.l2jmobius.gameserver.handler.DailyMissionHandler; import org.l2jmobius.gameserver.handler.DailyMissionHandler;
import org.l2jmobius.gameserver.handler.EffectHandler; import org.l2jmobius.gameserver.handler.EffectHandler;
import org.l2jmobius.gameserver.handler.SkillConditionHandler; import org.l2jmobius.gameserver.handler.SkillConditionHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.AirShipManager; import org.l2jmobius.gameserver.instancemanager.AirShipManager;
import org.l2jmobius.gameserver.instancemanager.AntiFeedManager; import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.BoatManager; import org.l2jmobius.gameserver.instancemanager.BoatManager;
@@ -126,6 +125,7 @@ import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager; import org.l2jmobius.gameserver.instancemanager.GraciaSeedsManager;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager; import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager; import org.l2jmobius.gameserver.instancemanager.ItemAuctionManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager; import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
@@ -208,9 +208,9 @@ public class GameServer
printSection("ThreadPool"); printSection("ThreadPool");
ThreadPool.init(); ThreadPool.init();
printSection("IdFactory"); printSection("IdManager");
IdFactory.init(); IdManager.getInstance();
if (!IdFactory.hasInitialized()) if (!IdManager.hasInitialized())
{ {
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration."); LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!"); throw new Exception("Could not initialize the ID factory!");
@@ -425,7 +425,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance()); Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size()); LOGGER.info("IdManager: Free ObjectID's remaining: " + IdManager.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{ {
@@ -35,10 +35,10 @@ import org.l2jmobius.gameserver.communitybbs.Manager.ForumsBBSManager;
import org.l2jmobius.gameserver.data.xml.impl.ClanHallData; import org.l2jmobius.gameserver.data.xml.impl.ClanHallData;
import org.l2jmobius.gameserver.enums.ClanWarState; import org.l2jmobius.gameserver.enums.ClanWarState;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.instancemanager.ClanEntryManager; import org.l2jmobius.gameserver.instancemanager.ClanEntryManager;
import org.l2jmobius.gameserver.instancemanager.FortManager; import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.clan.Clan; import org.l2jmobius.gameserver.model.clan.Clan;
@@ -196,7 +196,7 @@ public class ClanTable
return null; return null;
} }
final Clan clan = new Clan(IdFactory.getNextId(), clanName); final Clan clan = new Clan(IdManager.getInstance().getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player); final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader); clan.setLeader(leader);
leader.setPlayerInstance(player); leader.setPlayerInstance(player);
@@ -271,7 +271,7 @@ public class ClanTable
} }
_clans.remove(clanId); _clans.remove(clanId);
IdFactory.releaseId(clanId); IdManager.getInstance().releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection()) try (Connection con = DatabaseFactory.getConnection())
{ {
@@ -34,7 +34,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData;
import org.l2jmobius.gameserver.engines.DocumentEngine; import org.l2jmobius.gameserver.engines.DocumentEngine;
import org.l2jmobius.gameserver.enums.ItemLocation; import org.l2jmobius.gameserver.enums.ItemLocation;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
@@ -212,7 +212,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference) public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{ {
// Create and Init the ItemInstance corresponding to the Item Identifier // Create and Init the ItemInstance corresponding to the Item Identifier
final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId); final ItemInstance item = new ItemInstance(IdManager.getInstance().getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId)) if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{ {
ScheduledFuture<?> itemLootShedule; ScheduledFuture<?> itemLootShedule;
@@ -330,7 +330,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED); item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item); World.getInstance().removeObject(item);
IdFactory.releaseId(item.getObjectId()); IdManager.getInstance().releaseId(item.getObjectId());
if (Config.LOG_ITEMS) if (Config.LOG_ITEMS)
{ {
@@ -1,337 +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.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.util.PrimeFinder;
/**
* @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
"SELECT owner_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT object_id FROM items WHERE object_id >= ? AND object_id < ?",
"SELECT charId FROM character_quests WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_contacts WHERE charId >= ? AND charId < ?",
"SELECT contactId FROM character_contacts WHERE contactId >= ? AND contactId < ?",
"SELECT charId FROM character_friends WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_friends WHERE friendId >= ? AND friendId < ?",
"SELECT charId FROM character_hennas WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipebook WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_recipeshoplist WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_shortcuts WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_macroses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_skills_save WHERE charId >= ? AND charId < ?",
"SELECT charId FROM character_subclasses WHERE charId >= ? AND charId < ?",
"SELECT charId FROM characters WHERE charId >= ? AND charId < ?",
"SELECT clanid FROM characters WHERE clanid >= ? AND clanid < ?",
"SELECT clan_id FROM clan_data WHERE clan_id >= ? AND clan_id < ?",
"SELECT clan_id FROM siege_clans WHERE clan_id >= ? AND clan_id < ?",
"SELECT ally_id FROM clan_data WHERE ally_id >= ? AND ally_id < ?",
"SELECT leader_id FROM clan_data WHERE leader_id >= ? AND leader_id < ?",
"SELECT item_obj_id FROM pets WHERE item_obj_id >= ? AND item_obj_id < ?",
"SELECT object_id FROM itemsonground WHERE object_id >= ? AND object_id < ?",
"SELECT summonId FROM characters_summons WHERE summonId >= ? AND summonId < ?"
};
//@formatter:off
private static final String[][] ID_EXTRACTS =
{
{"characters","charId"},
{"items","object_id"},
{"clan_data","clan_id"},
{"itemsonground","object_id"},
{"messages","messageId"}
};
//@formatter:on
private static final String[] TIMESTAMPS_CLEAN =
{
"DELETE FROM character_instance_time WHERE time <= ?",
"DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?"
};
public static final int FIRST_OID = 0x10000000;
public static final int LAST_OID = 0x7FFFFFFF;
public static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID;
private static BitSet _freeIds;
private static AtomicInteger _freeIdCount;
private static AtomicInteger _nextFreeId;
private static boolean _initialized;
public static void init()
{
// Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
statement.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
catch (Exception e)
{
LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
// Cleanup database.
if (Config.DATABASE_CLEAN_UP)
{
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
final long cleanupStart = System.currentTimeMillis();
int cleanCount = 0;
// Characters
cleanCount += statement.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
// Items
cleanCount += statement.executeUpdate("DELETE FROM items WHERE items.owner_id NOT IN (SELECT charId FROM characters) AND items.owner_id NOT IN (SELECT clan_id FROM clan_data) AND items.owner_id != -1;");
cleanCount += statement.executeUpdate("DELETE FROM items WHERE items.owner_id = -1 AND loc LIKE 'MAIL' AND loc_data NOT IN (SELECT messageId FROM messages WHERE senderId = -1);");
cleanCount += statement.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
// Misc
cleanCount += statement.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
// Clan
cleanCount += statement.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
// Forums
cleanCount += statement.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
cleanCount += statement.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
cleanCount += statement.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
cleanCount += statement.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
// Update needed items after cleaning has taken place.
statement.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
statement.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
statement.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
statement.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);");
statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
LOGGER.info("IdFactory: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds.");
}
catch (Exception e)
{
LOGGER.warning("IdFactory: Could not clean up database: " + e);
}
}
// Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
for (String line : TIMESTAMPS_CLEAN)
{
try (PreparedStatement statement = con.prepareStatement(line))
{
statement.setLong(1, System.currentTimeMillis());
cleanCount += statement.executeUpdate();
}
}
LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
catch (Exception e)
{
LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
// Initialize.
try
{
_freeIds = new BitSet(PrimeFinder.nextPrime(100000));
_freeIds.clear();
_freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
// Collect already used ids.
final List<Integer> usedIds = new ArrayList<>();
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
String extractUsedObjectIdsQuery = "";
for (String[] tblClmn : ID_EXTRACTS)
{
extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
}
extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
try (ResultSet result = statement.executeQuery(extractUsedObjectIdsQuery))
{
while (result.next())
{
usedIds.add(result.getInt(1));
}
}
}
Collections.sort(usedIds);
// Register used ids.
for (int usedObjectId : usedIds)
{
final int objectId = usedObjectId - FIRST_OID;
if (objectId < 0)
{
LOGGER.warning("IdFactory: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID);
continue;
}
_freeIds.set(usedObjectId - FIRST_OID);
_freeIdCount.decrementAndGet();
}
_nextFreeId = new AtomicInteger(_freeIds.nextClearBit(0));
_initialized = true;
}
catch (Exception e)
{
_initialized = false;
LOGGER.severe("IdFactory: Could not be initialized properly: " + e.getMessage());
}
// Schedule increase capacity task.
ThreadPool.scheduleAtFixedRate(() ->
{
synchronized (_nextFreeId)
{
if (PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size())
{
increaseBitSetCapacity();
}
}
}, 30000, 30000);
LOGGER.info("IdFactory: " + _freeIds.size() + " id's available.");
}
public synchronized static void releaseId(int objectId)
{
synchronized (_nextFreeId)
{
if ((objectId - FIRST_OID) > -1)
{
_freeIds.clear(objectId - FIRST_OID);
_freeIdCount.incrementAndGet();
}
else
{
LOGGER.warning("IdFactory: Release objectID " + objectId + " failed (< " + FIRST_OID + ")");
}
}
}
public synchronized static int getNextId()
{
synchronized (_nextFreeId)
{
final int newId = _nextFreeId.get();
_freeIds.set(newId);
_freeIdCount.decrementAndGet();
final int nextFree = _freeIds.nextClearBit(newId) < 0 ? _freeIds.nextClearBit(0) : _freeIds.nextClearBit(newId);
if (nextFree < 0)
{
if (_freeIds.size() >= FREE_OBJECT_ID_SIZE)
{
throw new NullPointerException("IdFactory: Ran out of valid ids.");
}
increaseBitSetCapacity();
}
_nextFreeId.set(nextFree);
return newId + FIRST_OID;
}
}
private static void increaseBitSetCapacity()
{
final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
newBitSet.or(_freeIds);
_freeIds = newBitSet;
}
private static int usedIdCount()
{
return _freeIdCount.get() - FIRST_OID;
}
public static int size()
{
return _freeIdCount.get();
}
public static boolean hasInitialized()
{
return _initialized;
}
}
@@ -0,0 +1,322 @@
/*
* 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.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.util.PrimeFinder;
/**
* @author Mobius (reworked from L2J IdFactory)
*/
public class IdManager
{
private static final Logger LOGGER = Logger.getLogger(IdManager.class.getName());
//@formatter:off
private static final String[][] ID_EXTRACTS =
{
{"characters","charId"},
{"items","object_id"},
{"clan_data","clan_id"},
{"itemsonground","object_id"},
{"messages","messageId"}
};
//@formatter:on
private static final String[] TIMESTAMPS_CLEAN =
{
"DELETE FROM character_instance_time WHERE time <= ?",
"DELETE FROM character_skills_save WHERE restore_type = 1 AND systime <= ?"
};
private static final int FIRST_OID = 0x10000000;
private static final int LAST_OID = 0x7FFFFFFF;
private static final int FREE_OBJECT_ID_SIZE = LAST_OID - FIRST_OID;
private static BitSet _freeIds;
private static AtomicInteger _freeIdCount;
private static AtomicInteger _nextFreeId;
private static boolean _initialized;
public IdManager()
{
// Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
statement.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
catch (Exception e)
{
LOGGER.warning("IdManager: Could not update characters online status: " + e);
}
// Cleanup database.
if (Config.DATABASE_CLEAN_UP)
{
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
final long cleanupStart = System.currentTimeMillis();
int cleanCount = 0;
// Characters
cleanCount += statement.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
// Items
cleanCount += statement.executeUpdate("DELETE FROM items WHERE items.owner_id NOT IN (SELECT charId FROM characters) AND items.owner_id NOT IN (SELECT clan_id FROM clan_data) AND items.owner_id != -1;");
cleanCount += statement.executeUpdate("DELETE FROM items WHERE items.owner_id = -1 AND loc LIKE 'MAIL' AND loc_data NOT IN (SELECT messageId FROM messages WHERE senderId = -1);");
cleanCount += statement.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
// Misc
cleanCount += statement.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
cleanCount += statement.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
cleanCount += statement.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
// Clan
cleanCount += statement.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += statement.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
// Forums
cleanCount += statement.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
cleanCount += statement.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
cleanCount += statement.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
cleanCount += statement.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
// Update needed items after cleaning has taken place.
statement.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
statement.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
statement.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
statement.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
statement.executeUpdate("UPDATE characters SET clanid=0, clan_privs=0, wantspeace=0, subpledge=0, lvl_joined_academy=0, apprentice=0, sponsor=0, clan_join_expiry_time=0, clan_create_expiry_time=0 WHERE characters.clanid > 0 AND characters.clanid NOT IN (SELECT clan_id FROM clan_data);");
statement.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
LOGGER.info("IdManager: Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " seconds.");
}
catch (Exception e)
{
LOGGER.warning("IdManager: Could not clean up database: " + e);
}
}
// Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
for (String line : TIMESTAMPS_CLEAN)
{
try (PreparedStatement statement = con.prepareStatement(line))
{
statement.setLong(1, System.currentTimeMillis());
cleanCount += statement.executeUpdate();
}
}
LOGGER.info("IdManager: Cleaned " + cleanCount + " expired timestamps from database.");
}
catch (Exception e)
{
LOGGER.warning("IdManager: Could not clean expired timestamps from database. " + e);
}
// Initialize.
try
{
_freeIds = new BitSet(PrimeFinder.nextPrime(100000));
_freeIds.clear();
_freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
// Collect already used ids.
final List<Integer> usedIds = new ArrayList<>();
try (Connection con = DatabaseFactory.getConnection();
Statement statement = con.createStatement())
{
String extractUsedObjectIdsQuery = "";
for (String[] tblClmn : ID_EXTRACTS)
{
extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
}
extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
try (ResultSet result = statement.executeQuery(extractUsedObjectIdsQuery))
{
while (result.next())
{
usedIds.add(result.getInt(1));
}
}
}
Collections.sort(usedIds);
// Register used ids.
for (int usedObjectId : usedIds)
{
final int objectId = usedObjectId - FIRST_OID;
if (objectId < 0)
{
LOGGER.warning("IdManager: Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID);
continue;
}
_freeIds.set(usedObjectId - FIRST_OID);
_freeIdCount.decrementAndGet();
}
_nextFreeId = new AtomicInteger(_freeIds.nextClearBit(0));
_initialized = true;
}
catch (Exception e)
{
_initialized = false;
LOGGER.severe("IdManager: Could not be initialized properly: " + e.getMessage());
}
// Schedule increase capacity task.
ThreadPool.scheduleAtFixedRate(() ->
{
synchronized (_nextFreeId)
{
if (PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size())
{
increaseBitSetCapacity();
}
}
}, 30000, 30000);
LOGGER.info("IdManager: " + _freeIds.size() + " id's available.");
}
public void releaseId(int objectId)
{
synchronized (_nextFreeId)
{
if ((objectId - FIRST_OID) > -1)
{
_freeIds.clear(objectId - FIRST_OID);
_freeIdCount.incrementAndGet();
}
else
{
LOGGER.warning("IdManager: Release objectID " + objectId + " failed (< " + FIRST_OID + ")");
}
}
}
public int getNextId()
{
synchronized (_nextFreeId)
{
final int newId = _nextFreeId.get();
_freeIds.set(newId);
_freeIdCount.decrementAndGet();
final int nextFree = _freeIds.nextClearBit(newId) < 0 ? _freeIds.nextClearBit(0) : _freeIds.nextClearBit(newId);
if (nextFree < 0)
{
if (_freeIds.size() >= FREE_OBJECT_ID_SIZE)
{
throw new NullPointerException("IdManager: Ran out of valid ids.");
}
increaseBitSetCapacity();
}
_nextFreeId.set(nextFree);
return newId + FIRST_OID;
}
}
private void increaseBitSetCapacity()
{
final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
newBitSet.or(_freeIds);
_freeIds = newBitSet;
}
private int usedIdCount()
{
return _freeIdCount.get() - FIRST_OID;
}
public static int size()
{
return _freeIdCount.get();
}
public static boolean hasInitialized()
{
return _initialized;
}
public static IdManager getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final IdManager INSTANCE = new IdManager();
}
}
@@ -31,7 +31,6 @@ import java.util.logging.Logger;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.enums.MailType; import org.l2jmobius.gameserver.enums.MailType;
import org.l2jmobius.gameserver.idfactory.IdFactory;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.entity.Message; import org.l2jmobius.gameserver.model.entity.Message;
@@ -277,7 +276,7 @@ public class MailManager
} }
_messages.remove(msgId); _messages.remove(msgId);
IdFactory.releaseId(msgId); IdManager.getInstance().releaseId(msgId);
} }
/** /**
@@ -21,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap;
import org.l2jmobius.gameserver.enums.PetitionState; import org.l2jmobius.gameserver.enums.PetitionState;
import org.l2jmobius.gameserver.enums.PetitionType; import org.l2jmobius.gameserver.enums.PetitionType;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.PetitionManager; import org.l2jmobius.gameserver.instancemanager.PetitionManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType) public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{ {
_id = IdFactory.getNextId(); _id = IdManager.getInstance().getNextId();
_type = PetitionType.values()[petitionType - 1]; _type = PetitionType.values()[petitionType - 1];
_content = petitionText; _content = petitionText;
_petitioner = petitioner; _petitioner = petitioner;
@@ -24,7 +24,7 @@ import org.l2jmobius.gameserver.handler.ActionHandler;
import org.l2jmobius.gameserver.handler.ActionShiftHandler; import org.l2jmobius.gameserver.handler.ActionShiftHandler;
import org.l2jmobius.gameserver.handler.IActionHandler; import org.l2jmobius.gameserver.handler.IActionHandler;
import org.l2jmobius.gameserver.handler.IActionShiftHandler; import org.l2jmobius.gameserver.handler.IActionShiftHandler;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
@@ -154,8 +154,8 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
public void refreshId() public void refreshId()
{ {
World.getInstance().removeObject(this); World.getInstance().removeObject(this);
IdFactory.releaseId(getObjectId()); IdManager.getInstance().releaseId(getObjectId());
_objectId = IdFactory.getNextId(); _objectId = IdManager.getInstance().getNextId();
} }
@Override @Override
@@ -63,7 +63,7 @@ import org.l2jmobius.gameserver.enums.Team;
import org.l2jmobius.gameserver.enums.TeleportWhereType; import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.idfactory.IdFactory; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
@@ -288,7 +288,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/ */
public Creature(CreatureTemplate template) public Creature(CreatureTemplate template)
{ {
this(IdFactory.getNextId(), template); this(IdManager.getInstance().getNextId(), template);
} }
/** /**

Some files were not shown because too many files have changed in this diff Show More