diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/config/IdFactory.ini b/L2J_Mobius_1.0_Ertheia/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_1.0_Ertheia/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/Config.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/Config.java
index 510ed3db01..dac1494803 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -96,7 +95,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -802,9 +800,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int[] AUGMENTATION_BLACKLIST;
@@ -1932,12 +1927,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/GameServer.java
index 4846f1d22f..42723538a3 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/GameServer.java
@@ -205,7 +205,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -416,7 +417,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 2f80c1f6c1..80749d7bc1 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -188,7 +188,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -260,7 +260,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 0ff9b6f6cf..c8f9f73a55 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -210,7 +210,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -328,7 +328,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Creature.java
index e08591eecd..a990648d2d 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index 7107888bf7..5c91cf6efd 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1135,7 +1135,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2375543774..a75ea14eac 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index ac9b81d9f2..f687b13e1e 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -254,7 +254,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_2.5_Underground/dist/game/config/IdFactory.ini b/L2J_Mobius_2.5_Underground/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_2.5_Underground/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/Config.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/Config.java
index 58999226b3..a065f8c298 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -97,7 +96,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -809,9 +807,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int[] AUGMENTATION_BLACKLIST;
@@ -1949,12 +1944,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/GameServer.java
index 43f89ae991..ef89971694 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/GameServer.java
@@ -209,7 +209,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -424,7 +425,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 2f80c1f6c1..80749d7bc1 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -188,7 +188,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -260,7 +260,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 0ff9b6f6cf..c8f9f73a55 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -210,7 +210,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -328,7 +328,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/Creature.java
index e08591eecd..a990648d2d 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index ae4d5fb15b..0e4ee476d4 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1141,7 +1141,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2375543774..a75ea14eac 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 70ca95ac59..9b600dc172 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_3.0_Helios/dist/game/config/IdFactory.ini b/L2J_Mobius_3.0_Helios/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_3.0_Helios/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java
index e9cf52edef..3b9dbceda9 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -97,7 +96,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -810,9 +808,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int[] AUGMENTATION_BLACKLIST;
@@ -1962,12 +1957,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/GameServer.java
index 43f89ae991..ef89971694 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/GameServer.java
@@ -209,7 +209,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -424,7 +425,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 1b1f73736c..67fe013334 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 0ff9b6f6cf..c8f9f73a55 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -210,7 +210,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -328,7 +328,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 5b41b0c085..53a2facb45 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index 84b7621049..f9ef29de30 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1143,7 +1143,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2375543774..a75ea14eac 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 70ca95ac59..9b600dc172 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/config/IdFactory.ini b/L2J_Mobius_4.0_GrandCrusade/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java
index 84ba927bcc..301c881ff4 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -97,7 +96,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -797,9 +795,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int[] AUGMENTATION_BLACKLIST;
@@ -1942,12 +1937,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/GameServer.java
index 73147542f4..256f657fe5 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/GameServer.java
@@ -209,7 +209,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -424,7 +425,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index d58c380aa4..e04768b302 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 0ff9b6f6cf..c8f9f73a55 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -210,7 +210,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -328,7 +328,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 5b41b0c085..53a2facb45 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index 61e76340d4..7e6af6417a 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1156,7 +1156,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2375543774..a75ea14eac 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 443f1dbdd6..730cc9b974 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/config/IdFactory.ini b/L2J_Mobius_5.0_Salvation/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_5.0_Salvation/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java
index b7e6a0da25..9ba5d823fd 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -98,7 +97,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -792,9 +790,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int[] AUGMENTATION_BLACKLIST;
@@ -1944,12 +1939,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/GameServer.java
index 1bdba3bc2c..451901aa03 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/GameServer.java
@@ -210,7 +210,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -426,7 +427,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index d58c380aa4..e04768b302 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 6248a56610..12132eb48c 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -211,7 +211,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -329,7 +329,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 88b62d2c3d..889a7f5978 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index 12497ef5ae..224aae26c8 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1149,7 +1149,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2375543774..a75ea14eac 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 87b057750e..e4b9285031 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -262,7 +262,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/config/IdFactory.ini b/L2J_Mobius_5.5_EtinasFate/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java
index b7e6a0da25..9ba5d823fd 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -98,7 +97,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -792,9 +790,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int[] AUGMENTATION_BLACKLIST;
@@ -1944,12 +1939,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/GameServer.java
index 1bdba3bc2c..451901aa03 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/GameServer.java
@@ -210,7 +210,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -426,7 +427,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index d58c380aa4..e04768b302 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 848b89ce55..131f5fbe3a 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -213,7 +213,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -331,7 +331,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 88b62d2c3d..889a7f5978 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index b44a181467..189760632b 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1149,7 +1149,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2375543774..a75ea14eac 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 87b057750e..e4b9285031 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -262,7 +262,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/config/IdFactory.ini b/L2J_Mobius_6.0_Fafurion/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_6.0_Fafurion/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java
index 37c491bfdc..f49acdcfad 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -98,7 +97,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -793,9 +791,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int MIN_ARMOR_ENCHANT_ANNOUNCE;
@@ -1982,12 +1977,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/GameServer.java
index 4251cf75b7..874517fa27 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/GameServer.java
@@ -211,7 +211,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -428,7 +429,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index d58c380aa4..e04768b302 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 848b89ce55..131f5fbe3a 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -213,7 +213,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -331,7 +331,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 88b62d2c3d..889a7f5978 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index c6e976f48f..5d2abc3fa0 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1149,7 +1149,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2375543774..a75ea14eac 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 87b057750e..e4b9285031 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -262,7 +262,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/IdFactory.ini b/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java
index dd223cc6ce..b2b273b979 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -98,7 +97,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -795,9 +793,6 @@ public class Config
public static int MAX_SYMBOL_SEAL_POINTS;
public static int CONSUME_SYMBOL_SEAL_POINTS;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int MIN_ARMOR_ENCHANT_ANNOUNCE;
@@ -1997,12 +1992,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java
index 2bb5681d30..05d4f8054a 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java
@@ -213,7 +213,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -432,7 +433,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index d58c380aa4..e04768b302 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 848b89ce55..131f5fbe3a 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -213,7 +213,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -331,7 +331,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Petition.java
index db0452495e..6359879c23 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 59c14d567a..0ddcc77fb1 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index bacd658ca1..f87a25712d 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1158,7 +1158,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2375543774..a75ea14eac 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 87b057750e..e4b9285031 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -262,7 +262,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_C6_Interlude/dist/game/config/protected/IdFactory.ini b/L2J_Mobius_C6_Interlude/dist/game/config/protected/IdFactory.ini
deleted file mode 100644
index 795d94cac9..0000000000
--- a/L2J_Mobius_C6_Interlude/dist/game/config/protected/IdFactory.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-# Tell server which IDFactory Class to use
-# Options are:
-# BITSET (One non compaction method - default),
-# STACK (Another non compaction method)
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up
-# Much faster load time without it, but may cause problems
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_C6_Interlude/dist/game/data/scripts/ai/others/FeedableBeasts.java b/L2J_Mobius_C6_Interlude/dist/game/data/scripts/ai/others/FeedableBeasts.java
index 10fe92bd40..50ec76d62e 100644
--- a/L2J_Mobius_C6_Interlude/dist/game/data/scripts/ai/others/FeedableBeasts.java
+++ b/L2J_Mobius_C6_Interlude/dist/game/data/scripts/ai/others/FeedableBeasts.java
@@ -400,7 +400,7 @@ public class FeedableBeasts extends Quest
}
final NpcTemplate template = NpcTable.getInstance().getTemplate(nextNpcId);
- final TamedBeastInstance nextNpc = new TamedBeastInstance(IdFactory.getInstance().getNextId(), template, player, food, npc.getX(), npc.getY(), npc.getZ());
+ final TamedBeastInstance nextNpc = new TamedBeastInstance(IdFactory.getNextId(), template, player, food, npc.getX(), npc.getY(), npc.getZ());
nextNpc.setRunning();
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/Config.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/Config.java
index bbde1f1b33..435d51fb0d 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/Config.java
@@ -36,7 +36,6 @@ import java.util.Map;
import java.util.Properties;
import java.util.logging.Logger;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.ClassMasterSettings;
import org.l2jmobius.commons.util.L2Properties;
@@ -78,7 +77,6 @@ public class Config
// protected
private static final String DAEMONS_CONFIG_FILE = "./config/protected/Daemons.ini";
private static final String PROTECT_FLOOD_CONFIG_FILE = "./config/protected/Flood.ini";
- private static final String ID_CONFIG_FILE = "./config/protected/IdFactory.ini";
private static final String PROTECT_OTHER_CONFIG_FILE = "./config/protected/Other.ini";
public static final String TELNET_CONFIG_FILE = "./config/protected/Telnet.ini";
// events
@@ -216,9 +214,6 @@ public class Config
public static boolean IS_TELNET_ENABLED;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static boolean JAIL_IS_PVP;
public static boolean JAIL_DISABLE_CHAT;
public static int WYVERN_SPEED;
@@ -1282,25 +1277,6 @@ public class Config
}
- public static void loadIdFactoryConfig()
- {
- try
- {
- final Properties idSettings = new Properties();
- final InputStream is = new FileInputStream(new File(ID_CONFIG_FILE));
- idSettings.load(is);
- is.close();
-
- IDFACTORY_TYPE = IdFactoryType.valueOf(idSettings.getProperty("IDFactory", "BITSET"));
- BAD_ID_CHECKING = Boolean.parseBoolean(idSettings.getProperty("BadIdChecking", "true"));
- }
- catch (Exception e)
- {
- e.printStackTrace();
- throw new Error("Failed to Load " + ID_CONFIG_FILE + " File.");
- }
- }
-
public static void loadRatesConfig()
{
try
@@ -3768,9 +3744,6 @@ public class Config
// Load network
loadServerConfig();
- // Load system
- loadIdFactoryConfig();
-
// Head
loadRatesConfig();
loadCharacterConfig();
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/GameServer.java
index e62265fba7..8ad0767a61 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/GameServer.java
@@ -180,7 +180,8 @@ public class GameServer
}
Util.printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe("IdFactory: Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -412,7 +413,7 @@ public class GameServer
Util.printSection("Game Server");
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if (Config.L2JMOD_ALLOW_WEDDING)
{
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/cache/CrestCache.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/cache/CrestCache.java
index bb26d0144f..36277c2a68 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/cache/CrestCache.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/cache/CrestCache.java
@@ -140,10 +140,8 @@ public class CrestCache
LOGGER.info("Found old crest file \"" + file.getName() + "\" for clanId " + clanId);
- final int newId = IdFactory.getInstance().getNextId();
-
+ final int newId = IdFactory.getNextId();
final Clan clan = ClanTable.getInstance().getClan(clanId);
-
if (clan != null)
{
removeOldPledgeCrest(clan.getCrestId());
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 283e721cb5..cc5e7142bf 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -180,7 +180,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, int count, PlayerInstance actor, WorldObject reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
// create loot schedule also if autoloot is enabled
if (process.equalsIgnoreCase("loot")/* && !Config.AUTO_LOOT */)
@@ -299,7 +299,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
// if it's a pet control item, delete the pet as well
if (PetDataTable.isPetItem(item.getItemId()))
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/sql/ClanTable.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/sql/ClanTable.java
index c320c9e092..25bb254984 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/sql/ClanTable.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/sql/ClanTable.java
@@ -191,7 +191,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player.getName(), player.getLevel(), player.getClassId().getId(), player.getObjectId(), player.getPledgeType(), player.getPowerGrade(), player.getTitle());
clan.setLeader(leader);
@@ -329,7 +329,7 @@ public class ClanTable
final int clanLvl = clan.getLevel();
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/BoatData.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/BoatData.java
index b06ed0d491..d434a1616b 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/BoatData.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/BoatData.java
@@ -123,7 +123,7 @@ public class BoatData implements IXmlReader
npcDat.set("baseMDef", 100);
final CreatureTemplate template = new CreatureTemplate(npcDat);
- final BoatInstance boat = new BoatInstance(IdFactory.getInstance().getNextId(), template);
+ final BoatInstance boat = new BoatInstance(IdFactory.getNextId(), template);
boat.getPosition().setHeading(set.getInt("heading"));
boat.setXYZ(set.getInt("spawnX"), set.getInt("spawnY"), set.getInt("spawnZ"));
boat.setPathA(set.getInt("pathIdA"), set.getInt("ticketA"), set.getInt("xTeleNoTicketA"), set.getInt("yTeleNoTicketA"), set.getInt("zTeleNoTicketA"), set.getString("announcerA"), set.getString("message10A"), set.getString("message5A"), set.getString("message1A"), set.getString("message0A"), set.getString("messageBeginA"), paths.get(set.getInt("pathIdA")));
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/DoorData.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/DoorData.java
index 36edddbc5b..f74d4a8c26 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/DoorData.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/DoorData.java
@@ -180,7 +180,7 @@ public class DoorData implements IXmlReader
npcDat.set("baseMDef", mDef);
final CreatureTemplate template = new CreatureTemplate(npcDat);
- final DoorInstance door = new DoorInstance(IdFactory.getInstance().getNextId(), template, id, name, unlockable);
+ final DoorInstance door = new DoorInstance(IdFactory.getNextId(), template, id, name, unlockable);
door.setRange(xMin, yMin, zMin, xMax, yMax, zMax);
try
{
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/StaticObjectData.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/StaticObjectData.java
index 9f9e16ae86..d75dd94dd9 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/StaticObjectData.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/datatables/xml/StaticObjectData.java
@@ -75,7 +75,7 @@ public class StaticObjectData implements IXmlReader
}
// Create and spawn the StaticObject instance.
- final StaticObjectInstance obj = new StaticObjectInstance(IdFactory.getInstance().getNextId());
+ final StaticObjectInstance obj = new StaticObjectInstance(IdFactory.getNextId());
obj.setType(set.getInt("type"));
obj.setStaticObjectId(set.getInt("id"));
obj.setXYZ(set.getInt("x"), set.getInt("y"), set.getInt("z"));
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/admincommandhandlers/AdminFightCalculator.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/admincommandhandlers/AdminFightCalculator.java
index 7f669cc638..a8ddb86c6e 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/admincommandhandlers/AdminFightCalculator.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/admincommandhandlers/AdminFightCalculator.java
@@ -216,9 +216,9 @@ public class AdminFightCalculator implements IAdminCommandHandler
mid1 = Integer.parseInt(st.nextToken());
mid2 = Integer.parseInt(st.nextToken());
- npc1 = new MonsterInstance(IdFactory.getInstance().getNextId(), NpcTable.getInstance().getTemplate(mid1));
+ npc1 = new MonsterInstance(IdFactory.getNextId(), NpcTable.getInstance().getTemplate(mid1));
- npc2 = new MonsterInstance(IdFactory.getInstance().getNextId(), NpcTable.getInstance().getTemplate(mid2));
+ npc2 = new MonsterInstance(IdFactory.getNextId(), NpcTable.getInstance().getTemplate(mid2));
}
int miss1 = 0;
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/ChristmasTree.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/ChristmasTree.java
index c1964d33ee..c2fdcc5d51 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/ChristmasTree.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/ChristmasTree.java
@@ -73,7 +73,7 @@ public class ChristmasTree implements IItemHandler
try
{
final Spawn spawn = new Spawn(template1);
- spawn.setId(IdFactory.getInstance().getNextId());
+ spawn.setId(IdFactory.getNextId());
spawn.setX(target.getX());
spawn.setY(target.getY());
spawn.setZ(target.getZ());
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/JackpotSeed.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/JackpotSeed.java
index 12dd987987..6b9a848a73 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/JackpotSeed.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/JackpotSeed.java
@@ -64,7 +64,7 @@ public class JackpotSeed implements IItemHandler
try
{
final Spawn spawn = new Spawn(template1);
- spawn.setId(IdFactory.getInstance().getNextId());
+ spawn.setId(IdFactory.getNextId());
spawn.setX(player.getX());
spawn.setY(player.getY());
spawn.setZ(player.getZ());
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/SummonItems.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/SummonItems.java
index 0ec1241539..9a7876e2e2 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/SummonItems.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/SummonItems.java
@@ -148,7 +148,7 @@ public class SummonItems implements IItemHandler
try
{
final Spawn spawn = new Spawn(npcTemplate);
- spawn.setId(IdFactory.getInstance().getNextId());
+ spawn.setId(IdFactory.getNextId());
spawn.setX(player.getX());
spawn.setY(player.getY());
spawn.setZ(player.getZ());
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/skillhandlers/SiegeFlag.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/skillhandlers/SiegeFlag.java
index 65b6b06cc1..0a7519be75 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/skillhandlers/SiegeFlag.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/skillhandlers/SiegeFlag.java
@@ -79,7 +79,7 @@ public class SiegeFlag implements ISkillHandler
try
{
// Spawn a new flag
- final SiegeFlagInstance flag = new SiegeFlagInstance(player, IdFactory.getInstance().getNextId(), NpcTable.getInstance().getTemplate(35062));
+ final SiegeFlagInstance flag = new SiegeFlagInstance(player, IdFactory.getNextId(), NpcTable.getInstance().getTemplate(35062));
if (skill.isAdvancedFlag())
{
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 02352c46b3..23e7379558 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -17,24 +17,26 @@
package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
+import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -59,80 +61,50 @@ public abstract class IdFactory
"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 < ?"
};
-
//@formatter:off
private static final String[][] ID_EXTRACTS =
{
- {"characters", "obj_Id"},
- {"items", "object_id"},
- {"clan_data", "clan_id"},
- {"itemsonground", "object_id"}
+ {"characters","obj_Id"},
+ {"items","object_id"},
+ {"clan_data","clan_id"},
+ {"itemsonground","object_id"}
};
//@formatter:on
-
- protected boolean _initialized;
-
+ private static final String[] TIMESTAMPS_CLEAN =
+ {
+ "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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- cleanUpDB();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection())
+
+ // Cleanup database.
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
{
+ final long cleanupStart = System.currentTimeMillis();
int cleanCount = 0;
- final Statement stmt = con.createStatement();
- // Character related
+
+ // Characters
cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.char_id NOT IN (SELECT obj_Id FROM characters);");
cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.char_obj_id NOT IN (SELECT obj_Id FROM characters);");
cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.char_obj_id NOT IN (SELECT obj_Id FROM characters);");
@@ -147,10 +119,12 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.char_id NOT IN (SELECT obj_Id FROM characters);");
cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
cleanCount += stmt.executeUpdate("DELETE FROM seven_signs WHERE seven_signs.char_obj_id NOT IN (SELECT obj_Id FROM characters);");
+
// Auction
cleanCount += stmt.executeUpdate("DELETE FROM auction WHERE auction.id IN (SELECT id FROM clanhall WHERE ownerId <> 0);");
cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auctionId IN (SELECT id FROM clanhall WHERE ownerId <> 0)");
- // Clan related
+
+ // Clan
stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT obj_Id FROM characters);");
cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
@@ -162,71 +136,165 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
stmt.executeUpdate("UPDATE castle SET taxpercent=0 WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- // Character & clan related
- cleanCount += stmt.executeUpdate("DELETE FROM items WHERE items.owner_id NOT IN (SELECT obj_Id FROM characters) AND items.owner_id NOT IN (SELECT clan_id FROM clan_data);");
- stmt.executeUpdate("UPDATE characters SET clanid=0 WHERE characters.clanid NOT IN (SELECT clan_id FROM clan_data);");
- // Forum related
+
+ // Forums
cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- stmt.close();
- LOGGER.info("Cleaned " + cleanCount + " elements from database.");
- }
- catch (SQLException e)
- {
- // Ignore.
- }
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
- {
- String extractUsedObjectIdsQuery = "";
+ // Update needed items after cleaning has taken place.
+ cleanCount += stmt.executeUpdate("DELETE FROM items WHERE items.owner_id NOT IN (SELECT obj_Id FROM characters) AND items.owner_id NOT IN (SELECT clan_id FROM clan_data);");
+ stmt.executeUpdate("UPDATE characters SET clanid=0 WHERE characters.clanid NOT IN (SELECT clan_id FROM clan_data);");
- for (String[] tblClmn : ID_EXTRACTS)
+ 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)
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ try (PreparedStatement stmt = con.prepareStatement(line))
{
- temp.add(rs.getInt(1));
+ stmt.setLong(1, System.currentTimeMillis());
+ cleanCount += stmt.executeUpdate();
}
}
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/ChristmasManager.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/ChristmasManager.java
index 219e00e985..ce4a1b4831 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/ChristmasManager.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/ChristmasManager.java
@@ -472,7 +472,7 @@ public class ChristmasManager
final NpcTemplate template1 = NpcTable.getInstance().getTemplate(id);
final Spawn spawn = new Spawn(template1);
- spawn.setId(IdFactory.getInstance().getNextId());
+ spawn.setId(IdFactory.getNextId());
spawn.setX(x);
spawn.setY(y);
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java
index 9ea9f27e21..0a1b4408fb 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java
@@ -716,7 +716,7 @@ public class MercTicketManager
{
itemId = ITEM_IDS[i];
// create the ticket in the gameworld
- final ItemInstance dropticket = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance dropticket = new ItemInstance(IdFactory.getNextId(), itemId);
dropticket.setLocation(ItemInstance.ItemLocation.VOID);
dropticket.dropMe(null, x, y, z);
dropticket.setDropTime(0); // avoids it from beeing removed by the auto item destroyer
@@ -840,7 +840,7 @@ public class MercTicketManager
castle.getSiege().getSiegeGuardManager().hireMerc(x, y, z, heading, NPC_IDS[i]);
// create the ticket in the gameworld
- final ItemInstance dropticket = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance dropticket = new ItemInstance(IdFactory.getNextId(), itemId);
dropticket.setLocation(ItemInstance.ItemLocation.INVENTORY);
dropticket.dropMe(null, x, y, z);
dropticket.setDropTime(0); // avoids it from beeing removed by the auto item destroyer
@@ -859,7 +859,7 @@ public class MercTicketManager
final NpcTemplate template = NpcTable.getInstance().getTemplate(npcId);
if (template != null)
{
- final SiegeGuardInstance npc = new SiegeGuardInstance(IdFactory.getInstance().getNextId(), template);
+ final SiegeGuardInstance npc = new SiegeGuardInstance(IdFactory.getNextId(), template);
npc.setCurrentHpMp(npc.getMaxHp(), npc.getMaxMp());
npc.setDecayed(false);
npc.spawnMe(x, y, (z + 20));
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/PetitionManager.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/PetitionManager.java
index 0066fae67b..ec2d28d673 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/PetitionManager.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/PetitionManager.java
@@ -89,7 +89,7 @@ public class PetitionManager
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
petitionType--;
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
if (petitionType >= PetitionType.values().length)
{
LOGGER.warning("PetitionManager:Petition : invalid petition type (received type was +1) : " + petitionType);
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/WorldObject.java
index 4ee046bf08..fde6453216 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -205,11 +205,11 @@ public abstract class WorldObject
World.getInstance().removeVisibleObject(this, oldregion);
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
/**
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index 59c9c95a6c..b29ba5cc83 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -42,7 +42,7 @@ public class FenceInstance extends WorldObject
public FenceInstance(int x, int y, String name, int width, int length, int height, FenceState state)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -60,7 +60,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java
index 96c13d79cd..13786f08e7 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java
@@ -2088,7 +2088,7 @@ public class NpcInstance extends Creature
sm.addItemName(4442);
player.sendPacket(sm);
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4442);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4442);
item.setCount(1);
item.setCustomType1(lotonumber);
item.setEnchantLevel(enchant);
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PetInstance.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PetInstance.java
index cce0445f9a..c95e02db84 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PetInstance.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PetInstance.java
@@ -844,11 +844,11 @@ public class PetInstance extends Summon
{
if (template.getType().equalsIgnoreCase("BabyPet"))
{
- pet = new BabyPetInstance(IdFactory.getInstance().getNextId(), template, owner, control);
+ pet = new BabyPetInstance(IdFactory.getNextId(), template, owner, control);
}
else
{
- pet = new PetInstance(IdFactory.getInstance().getNextId(), template, owner, control);
+ pet = new PetInstance(IdFactory.getNextId(), template, owner, control);
}
final PreparedStatement statement = con.prepareStatement("SELECT item_obj_id, name, level, curHp, curMp, exp, sp, karma, pkkills, fed FROM pets WHERE item_obj_id=?");
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index af5d6b6bfc..bd0027e6b3 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends FolkInstance
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/Auction.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/Auction.java
index d2804d19c7..81be723b5a 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/Auction.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/Auction.java
@@ -401,7 +401,7 @@ public class Auction
else
{
statement = con.prepareStatement("INSERT INTO auction_bid (id, auctionId, bidderId, bidderName, maxBid, clan_name, time_bid) VALUES (?, ?, ?, ?, ?, ?, ?)");
- statement.setInt(1, IdFactory.getInstance().getNextId());
+ statement.setInt(1, IdFactory.getNextId());
statement.setInt(2, _id);
statement.setInt(3, bidder.getClanId());
statement.setString(4, bidder.getName());
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/Wedding.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/Wedding.java
index 35f53819b9..9b386b19fd 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/Wedding.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/Wedding.java
@@ -95,7 +95,7 @@ public class Wedding
{
PreparedStatement statement;
- _Id = IdFactory.getInstance().getNextId();
+ _Id = IdFactory.getNextId();
statement = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)");
statement.setInt(1, _Id);
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/event/MonsterRace.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/event/MonsterRace.java
index e788d783c1..c58d29b23a 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/event/MonsterRace.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/event/MonsterRace.java
@@ -332,7 +332,7 @@ public class MonsterRace
{
final NpcTemplate template = NpcTable.getInstance().getTemplate(_npcTemplates.get(i));
_constructor = Class.forName("org.l2jmobius.gameserver.model.actor.instance." + template.getType() + "Instance").getConstructors()[0];
- final int objectId = IdFactory.getInstance().getNextId();
+ final int objectId = IdFactory.getNextId();
_monsters[i] = (NpcInstance) _constructor.newInstance(objectId, template);
}
catch (Exception e)
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/FortSiege.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/FortSiege.java
index e61c32f42e..a8d6f70f43 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/FortSiege.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/FortSiege.java
@@ -1363,7 +1363,7 @@ public class FortSiege
{
CommanderInstance commander;
- commander = new CommanderInstance(IdFactory.getInstance().getNextId(), NpcTable.getInstance().getTemplate(_sp.getNpcId()));
+ commander = new CommanderInstance(IdFactory.getNextId(), NpcTable.getInstance().getTemplate(_sp.getNpcId()));
commander.setCurrentHpMp(commander.getMaxHp(), commander.getMaxMp());
commander.setHeading(_sp.getLocation().getHeading());
commander.spawnMe(_sp.getLocation().getX(), _sp.getLocation().getY(), _sp.getLocation().getZ() + 50);
@@ -1387,7 +1387,7 @@ public class FortSiege
{
ArtefactInstance combatflag;
- combatflag = new ArtefactInstance(IdFactory.getInstance().getNextId(), NpcTable.getInstance().getTemplate(_sp.getNpcId()));
+ combatflag = new ArtefactInstance(IdFactory.getNextId(), NpcTable.getInstance().getTemplate(_sp.getNpcId()));
combatflag.setCurrentHpMp(combatflag.getMaxHp(), combatflag.getMaxMp());
combatflag.setHeading(_sp.getLocation().getHeading());
combatflag.spawnMe(_sp.getLocation().getX(), _sp.getLocation().getY(), _sp.getLocation().getZ() + 10);
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/Siege.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/Siege.java
index f3efd21d1a..1062084ef3 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/Siege.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/Siege.java
@@ -1595,7 +1595,7 @@ public class Siege
{
ArtefactInstance art;
- art = new ArtefactInstance(IdFactory.getInstance().getNextId(), NpcTable.getInstance().getTemplate(_sp.getNpcId()));
+ art = new ArtefactInstance(IdFactory.getNextId(), NpcTable.getInstance().getTemplate(_sp.getNpcId()));
art.setCurrentHpMp(art.getMaxHp(), art.getMaxMp());
art.setHeading(_sp.getLocation().getHeading());
art.spawnMe(_sp.getLocation().getX(), _sp.getLocation().getY(), _sp.getLocation().getZ() + 50);
@@ -1624,7 +1624,7 @@ public class Siege
template.getStatSet().set("baseHpMax", _sp.getHp());
- ct = new ControlTowerInstance(IdFactory.getInstance().getNextId(), template);
+ ct = new ControlTowerInstance(IdFactory.getNextId(), template);
ct.setCurrentHpMp(ct.getMaxHp(), ct.getMaxMp());
ct.spawnMe(_sp.getLocation().getX(), _sp.getLocation().getY(), _sp.getLocation().getZ() + 20);
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/BanditStrongholdSiege.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/BanditStrongholdSiege.java
index f4119334a5..f8bcc72ac7 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/BanditStrongholdSiege.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/BanditStrongholdSiege.java
@@ -274,7 +274,7 @@ public class BanditStrongholdSiege extends ClanHallSiege
continue;
}
template = NpcTable.getInstance().getTemplate(35427 + mobCounter);
- final MonsterInstance questMob = new MonsterInstance(IdFactory.getInstance().getNextId(), template);
+ final MonsterInstance questMob = new MonsterInstance(IdFactory.getNextId(), template);
questMob.setHeading(100);
questMob.getStatus().setCurrentHpMp(questMob.getMaxHp(), questMob.getMaxMp());
if (mobCounter == 1)
@@ -321,7 +321,7 @@ public class BanditStrongholdSiege extends ClanHallSiege
{
template = NpcTable.getInstance().getTemplate(35422 + flagCounter);
}
- final DecoInstance flag = new DecoInstance(IdFactory.getInstance().getNextId(), template);
+ final DecoInstance flag = new DecoInstance(IdFactory.getNextId(), template);
flag.setTitle(clan.getName());
flag.setHeading(100);
flag.getStatus().setCurrentHpMp(flag.getMaxHp(), flag.getMaxMp());
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/WildBeastFarmSiege.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/WildBeastFarmSiege.java
index 4ea33b0543..c086e174bb 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/WildBeastFarmSiege.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/WildBeastFarmSiege.java
@@ -262,7 +262,7 @@ public class WildBeastFarmSiege extends ClanHallSiege
NpcTemplate template;
final Clan clan = ClanTable.getInstance().getClanByName(clanName);
template = NpcTable.getInstance().getTemplate(35617 + mobCounter);
- final MonsterInstance questMob = new MonsterInstance(IdFactory.getInstance().getNextId(), template);
+ final MonsterInstance questMob = new MonsterInstance(IdFactory.getNextId(), template);
questMob.setHeading(100);
questMob.getStatus().setCurrentHpMp(questMob.getMaxHp(), questMob.getMaxMp());
if (mobCounter == 1)
@@ -309,7 +309,7 @@ public class WildBeastFarmSiege extends ClanHallSiege
{
template = NpcTable.getInstance().getTemplate(35422 + flagCounter);
}
- final DecoInstance flag = new DecoInstance(IdFactory.getInstance().getNextId(), template);
+ final DecoInstance flag = new DecoInstance(IdFactory.getNextId(), template);
flag.setTitle(clan.getName());
flag.setHeading(100);
flag.getStatus().setCurrentHpMp(flag.getMaxHp(), flag.getMaxMp());
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/effects/EffectSignetMDam.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/effects/EffectSignetMDam.java
index 49c2e23bed..8b308c156e 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/effects/EffectSignetMDam.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/effects/EffectSignetMDam.java
@@ -72,7 +72,7 @@ public class EffectSignetMDam extends Effect
return;
}
- final EffectPointInstance effectPoint = new EffectPointInstance(IdFactory.getInstance().getNextId(), template, getEffector());
+ final EffectPointInstance effectPoint = new EffectPointInstance(IdFactory.getNextId(), template, getEffector());
effectPoint.getStatus().setCurrentHp(effectPoint.getMaxHp());
effectPoint.getStatus().setCurrentMp(effectPoint.getMaxMp());
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillCreateItem.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillCreateItem.java
index 4a719bf502..63cce79694 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillCreateItem.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillCreateItem.java
@@ -75,7 +75,7 @@ public class SkillCreateItem extends Skill
*/
public void giveItems(PlayerInstance player, int itemId, int count)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(count);
player.getInventory().addItem("Skill", item, player, player);
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillSignet.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillSignet.java
index 16d149fbe8..c8e227e110 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillSignet.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillSignet.java
@@ -49,7 +49,7 @@ public class SkillSignet extends Skill
}
final NpcTemplate template = NpcTable.getInstance().getTemplate(_effectNpcId);
- final EffectPointInstance effectPoint = new EffectPointInstance(IdFactory.getInstance().getNextId(), template, caster);
+ final EffectPointInstance effectPoint = new EffectPointInstance(IdFactory.getNextId(), template, caster);
effectPoint.getStatus().setCurrentHp(effectPoint.getMaxHp());
effectPoint.getStatus().setCurrentMp(effectPoint.getMaxMp());
World.getInstance().storeObject(effectPoint);
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillSummon.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillSummon.java
index 6339735c13..00272de87a 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillSummon.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/skills/handlers/SkillSummon.java
@@ -210,11 +210,11 @@ public class SkillSummon extends Skill
}
if (summonTemplate.getType().equalsIgnoreCase("SiegeSummon"))
{
- summon = new SiegeSummonInstance(IdFactory.getInstance().getNextId(), summonTemplate, activeChar, this);
+ summon = new SiegeSummonInstance(IdFactory.getNextId(), summonTemplate, activeChar, this);
}
else
{
- summon = new SummonInstance(IdFactory.getInstance().getNextId(), summonTemplate, activeChar, this);
+ summon = new SummonInstance(IdFactory.getNextId(), summonTemplate, activeChar, this);
}
summon.setName(summonTemplate.getName());
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/AutoSpawn.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/AutoSpawn.java
index cf603f39bc..4aad9649aa 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/AutoSpawn.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/AutoSpawn.java
@@ -159,7 +159,7 @@ public class AutoSpawn
}
}
- final int newId = IdFactory.getInstance().getNextId();
+ final int newId = IdFactory.getNextId();
newSpawn._objectId = newId;
synchronized (_registeredSpawns)
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/GroupSpawn.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/GroupSpawn.java
index 8586bf2f0e..267c27d464 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/GroupSpawn.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/GroupSpawn.java
@@ -54,7 +54,7 @@ public class GroupSpawn extends Spawn
final Object[] parameters =
{
- IdFactory.getInstance().getNextId(),
+ IdFactory.getNextId(),
_template
};
final Object tmp = _constructor.newInstance(parameters);
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/Spawn.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/Spawn.java
index bcda9ca1d6..850adc0b15 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/Spawn.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/Spawn.java
@@ -398,7 +398,7 @@ public class Spawn
// Get NpcInstance Init parameters and its generate an Identifier
final Object[] parameters =
{
- IdFactory.getInstance().getNextId(),
+ IdFactory.getNextId(),
_template
};
@@ -460,9 +460,6 @@ public class Spawn
newlocz = _locZ;
}
- // if (npc != null)
- // {
-
// Do not correct z of flying NPCs.
if (!npc.isFlying())
{
@@ -513,8 +510,6 @@ public class Spawn
// Increase the current number of NpcInstance managed by this Spawn
_currentCount++;
- // }
-
return npc;
}
@@ -572,7 +567,7 @@ public class Spawn
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshId();
initializeNpcInstance(oldNpc);
}
}
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index e2aa2957a7..8b9fc58a63 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -95,7 +95,7 @@ public abstract class ZoneForm
protected static final void dropDebugItem(int id, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 57);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), 57);
item.setCount(id);
item.spawnMe(x, y, z + 5);
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/CharacterCreate.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/CharacterCreate.java
index 4f8e6e3bef..a424fe6d9c 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/CharacterCreate.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/CharacterCreate.java
@@ -123,7 +123,7 @@ public class CharacterCreate extends GameClientPacket
return;
}
- final int objectId = IdFactory.getInstance().getNextId();
+ final int objectId = IdFactory.getNextId();
newChar = PlayerInstance.create(objectId, template, getClient().getAccountName(), _name, _hairStyle, _hairColor, _face, _sex != 0);
newChar.setCurrentHp(newChar.getMaxHp()); // L2Off like
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestExSetPledgeCrestLarge.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestExSetPledgeCrestLarge.java
index 65af51f80c..16eee8ad7c 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestExSetPledgeCrestLarge.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestExSetPledgeCrestLarge.java
@@ -102,7 +102,7 @@ public class RequestExSetPledgeCrestLarge extends GameClientPacket
final CrestCache crestCache = CrestCache.getInstance();
- final int newId = IdFactory.getInstance().getNextId();
+ final int newId = IdFactory.getNextId();
if (!crestCache.savePledgeCrestLarge(newId, _data))
{
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestSetAllyCrest.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestSetAllyCrest.java
index 94493f16e1..02b3e81a7c 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestSetAllyCrest.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestSetAllyCrest.java
@@ -80,7 +80,7 @@ public class RequestSetAllyCrest extends GameClientPacket
final CrestCache crestCache = CrestCache.getInstance();
- final int newId = IdFactory.getInstance().getNextId();
+ final int newId = IdFactory.getNextId();
if (!crestCache.saveAllyCrest(newId, _data))
{
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestSetPledgeCrest.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestSetPledgeCrest.java
index 07b56b75d4..4ac6137e07 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestSetPledgeCrest.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestSetPledgeCrest.java
@@ -107,7 +107,7 @@ public class RequestSetPledgeCrest extends GameClientPacket
final CrestCache crestCache = CrestCache.getInstance();
- final int newId = IdFactory.getInstance().getNextId();
+ final int newId = IdFactory.getNextId();
if (clan.hasCrest())
{
diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/util/MinionList.java
index b03e5eb6be..f82f1005cc 100644
--- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -225,7 +225,7 @@ public class MinionList
final NpcTemplate minionTemplate = NpcTable.getInstance().getTemplate(minionid);
// Create and Init the Minion and generate its Identifier
- final MinionInstance monster = new MinionInstance(IdFactory.getInstance().getNextId(), minionTemplate);
+ final MinionInstance monster = new MinionInstance(IdFactory.getNextId(), minionTemplate);
// Set the Minion HP, MP and Heading
monster.setCurrentHpMp(monster.getMaxHp(), monster.getMaxMp());
diff --git a/L2J_Mobius_CT_2.4_Epilogue/dist/game/config/IdFactory.ini b/L2J_Mobius_CT_2.4_Epilogue/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_CT_2.4_Epilogue/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/bypasshandlers/Loto.java b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/bypasshandlers/Loto.java
index e132279ee2..f154550d23 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/bypasshandlers/Loto.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/bypasshandlers/Loto.java
@@ -226,7 +226,7 @@ public class Loto implements IBypassHandler
sm.addItemName(4442);
player.sendPacket(sm);
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4442);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4442);
item.setCount(1);
item.setCustomType1(lotonumber);
item.setEnchantLevel(enchant);
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java
index 3eb0a19c1e..ac719c14a7 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java
@@ -54,7 +54,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -94,7 +93,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -931,9 +929,6 @@ public class Config
public static int PVP_NORMAL_TIME;
public static int PVP_PVP_TIME;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static double ENCHANT_CHANCE_ELEMENT_STONE;
public static double ENCHANT_CHANCE_ELEMENT_CRYSTAL;
public static double ENCHANT_CHANCE_ELEMENT_JEWEL;
@@ -2016,12 +2011,6 @@ public class Config
TELNET_PASSWORD = telnetSettings.getString("Password", "");
TELNET_HOSTS = Arrays.asList(telnetSettings.getString("ListOfHosts", "127.0.0.1,::1").split(","));
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
EVERYBODY_HAS_ADMIN_RIGHTS = General.getBoolean("EverybodyHasAdminRights", false);
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/GameServer.java
index 86195b9ffd..9179aab112 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/GameServer.java
@@ -202,7 +202,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -422,7 +423,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
TvTManager.getInstance();
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 077b572c69..81d4ef7bc2 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -190,7 +190,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -265,7 +265,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index f8678b14c9..a81f742202 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -205,7 +205,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -320,7 +320,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 031c9a05ac..0000000000
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 21cd1d97a5..96529aff37 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -65,7 +67,6 @@ public abstract class IdFactory
"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 < ?"
};
-
//@formatter:off
private static final String[][] ID_EXTRACTS =
{
@@ -76,206 +77,140 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- if (Config.ALLOW_WEDDING)
- {
- cleanInvalidWeddings();
- }
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
+ if (Config.ALLOW_WEDDING)
+ {
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement s = con.createStatement())
+ {
+ s.executeUpdate("DELETE FROM mods_wedding WHERE player1Id NOT IN (SELECT charId FROM characters)");
+ s.executeUpdate("DELETE FROM mods_wedding WHERE player2Id NOT IN (SELECT charId FROM characters)");
+ LOGGER.info("Cleaned up invalid Weddings.");
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("IdFactory: Could not clean up invalid Weddings: " + e);
+ }
+ }
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_raid_points WHERE character_raid_points.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_ui_actions WHERE character_ui_actions.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_ui_categories WHERE character_ui_categories.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_attributes WHERE item_attributes.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM seven_signs WHERE seven_signs.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recommends WHERE character_recommends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recommends WHERE character_recommends.target_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clanhall_functions WHERE clanhall_functions.hall_id NOT IN (SELECT id FROM clanhall WHERE ownerId <> 0 union all SELECT clanHallId FROM siegable_clanhall WHERE ownerId <> 0);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET taxpercent=0 WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE clanhall SET ownerId=0, paidUntil=0, paid=0 WHERE clanhall.ownerId NOT IN (SELECT clan_id FROM clan_data);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_raid_points WHERE character_raid_points.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_ui_actions WHERE character_ui_actions.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_ui_categories WHERE character_ui_categories.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_attributes WHERE item_attributes.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM seven_signs WHERE seven_signs.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recommends WHERE character_recommends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recommends WHERE character_recommends.target_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clanhall_functions WHERE clanhall_functions.hall_id NOT IN (SELECT id FROM clanhall WHERE ownerId <> 0 union all SELECT clanHallId FROM siegable_clanhall WHERE ownerId <> 0);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET taxpercent=0 WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.executeUpdate("UPDATE clanhall SET ownerId=0, paidUntil=0, paid=0 WHERE clanhall.ownerId NOT IN (SELECT clan_id FROM clan_data);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanInvalidWeddings()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
- {
- s.executeUpdate("DELETE FROM mods_wedding WHERE player1Id NOT IN (SELECT charId FROM characters)");
- s.executeUpdate("DELETE FROM mods_wedding WHERE player2Id NOT IN (SELECT charId FROM characters)");
- LOGGER.info("Cleaned up invalid Weddings.");
- }
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up invalid Weddings: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -287,62 +222,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index 52c6368677..0000000000
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index c9ff14fcc4..4304dfc5bd 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -116,7 +116,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 953ed18eb0..77574dcd19 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -254,7 +254,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java
index 893fc4a4bd..681cc6a871 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java
@@ -188,7 +188,7 @@ public class MercTicketManager
{
itemId = ITEM_IDS[i];
// create the ticket in the gameworld
- final ItemInstance dropticket = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance dropticket = new ItemInstance(IdFactory.getNextId(), itemId);
dropticket.setItemLocation(ItemLocation.VOID);
dropticket.dropMe(null, x, y, z);
dropticket.setDropTime(0); // avoids it from being removed by the auto item destroyer
@@ -324,7 +324,7 @@ public class MercTicketManager
castle.getSiege().getSiegeGuardManager().hireMerc(x, y, z, heading, NPC_IDS[i]);
// create the ticket in the gameworld
- final ItemInstance dropticket = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance dropticket = new ItemInstance(IdFactory.getNextId(), itemId);
dropticket.setItemLocation(ItemLocation.VOID);
dropticket.dropMe(null, x, y, z);
dropticket.setDropTime(0); // avoids it from beeing removed by the auto item destroyer
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/AutoSpawnHandler.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/AutoSpawnHandler.java
index 189ba6fff6..2cf6b4e2f7 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/AutoSpawnHandler.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/AutoSpawnHandler.java
@@ -193,7 +193,7 @@ public class AutoSpawnHandler
}
}
- final int newId = IdFactory.getInstance().getNextId();
+ final int newId = IdFactory.getNextId();
newSpawn._objectId = newId;
_registeredSpawns.put(newId, newSpawn);
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Petition.java
index 1ff1d32e0e..b74dfcb361 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Spawn.java
index a96b3520b0..1ee7fb4294 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -560,7 +560,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshId();
initializeNpcInstance(oldNpc);
}
}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/WorldObject.java
index 4257ef3381..6dd39583b4 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -153,11 +153,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Creature.java
index e96e719c6c..f71580d2d3 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -289,7 +289,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index 8b854f5ee7..d51da51edb 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -52,7 +52,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -285,11 +285,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index 98fbe8b62c..739c77c158 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -844,7 +844,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
public void setPvpFlagLasts(long time)
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index e9aa717369..653a737252 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Auction.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Auction.java
index 0f40aa6caa..dd07c11e5f 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Auction.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Auction.java
@@ -352,7 +352,7 @@ public class Auction
{
try (PreparedStatement ps = con.prepareStatement("INSERT INTO auction_bid (id, auctionId, bidderId, bidderName, maxBid, clan_name, time_bid) VALUES (?, ?, ?, ?, ?, ?, ?)"))
{
- ps.setInt(1, IdFactory.getInstance().getNextId());
+ ps.setInt(1, IdFactory.getNextId());
ps.setInt(2, _id);
ps.setInt(3, bidder.getClanId());
ps.setString(4, bidder.getName());
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Couple.java
index b373cf6a96..99cfa4ad6c 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Message.java
index c9495554ed..c85e5028d8 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -95,7 +95,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -113,7 +113,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, SendBySystem sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -133,7 +133,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index b96095a724..3282c1f548 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -221,7 +221,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index fe65777f2f..ee2437143a 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/util/MinionList.java
index b9a8ba8175..f370042f4b 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshID();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/config/IdFactory.ini b/L2J_Mobius_CT_2.6_HighFive/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_CT_2.6_HighFive/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/bypasshandlers/Loto.java b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/bypasshandlers/Loto.java
index e132279ee2..f154550d23 100644
--- a/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/bypasshandlers/Loto.java
+++ b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/bypasshandlers/Loto.java
@@ -226,7 +226,7 @@ public class Loto implements IBypassHandler
sm.addItemName(4442);
player.sendPacket(sm);
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4442);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4442);
item.setCount(1);
item.setCustomType1(lotonumber);
item.setEnchantLevel(enchant);
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java
index e07aee4e58..716c9ca66f 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java
@@ -54,7 +54,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -94,7 +93,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -936,9 +934,6 @@ public class Config
public static int PVP_NORMAL_TIME;
public static int PVP_PVP_TIME;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static double ENCHANT_CHANCE_ELEMENT_STONE;
public static double ENCHANT_CHANCE_ELEMENT_CRYSTAL;
public static double ENCHANT_CHANCE_ELEMENT_JEWEL;
@@ -2022,12 +2017,6 @@ public class Config
TELNET_PASSWORD = telnetSettings.getString("Password", "");
TELNET_HOSTS = Arrays.asList(telnetSettings.getString("ListOfHosts", "127.0.0.1,::1").split(","));
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
EVERYBODY_HAS_ADMIN_RIGHTS = General.getBoolean("EverybodyHasAdminRights", false);
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/GameServer.java
index 32e232699f..35fd281f12 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/GameServer.java
@@ -203,7 +203,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -424,7 +425,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
TvTManager.getInstance();
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 077b572c69..81d4ef7bc2 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -190,7 +190,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -265,7 +265,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index f8678b14c9..a81f742202 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -205,7 +205,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -320,7 +320,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 031c9a05ac..0000000000
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index fd75e9d3be..02edb840d0 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -65,7 +67,6 @@ public abstract class IdFactory
"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 < ?"
};
-
//@formatter:off
private static final String[][] ID_EXTRACTS =
{
@@ -76,205 +77,139 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- if (Config.ALLOW_WEDDING)
- {
- cleanInvalidWeddings();
- }
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
+ if (Config.ALLOW_WEDDING)
+ {
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement s = con.createStatement())
+ {
+ s.executeUpdate("DELETE FROM mods_wedding WHERE player1Id NOT IN (SELECT charId FROM characters)");
+ s.executeUpdate("DELETE FROM mods_wedding WHERE player2Id NOT IN (SELECT charId FROM characters)");
+ LOGGER.info("Cleaned up invalid Weddings.");
+ }
+ catch (Exception e)
+ {
+ LOGGER.warning("IdFactory: Could not clean up invalid Weddings: " + e);
+ }
+ }
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_raid_points WHERE character_raid_points.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_ui_actions WHERE character_ui_actions.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_ui_categories WHERE character_ui_categories.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_attributes WHERE item_attributes.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM seven_signs WHERE seven_signs.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clanhall_functions WHERE clanhall_functions.hall_id NOT IN (SELECT id FROM clanhall WHERE ownerId <> 0 union all SELECT clanHallId FROM siegable_clanhall WHERE ownerId <> 0);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET taxpercent=0 WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE clanhall SET ownerId=0, paidUntil=0, paid=0 WHERE clanhall.ownerId NOT IN (SELECT clan_id FROM clan_data);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_raid_points WHERE character_raid_points.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_ui_actions WHERE character_ui_actions.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_ui_categories WHERE character_ui_categories.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_attributes WHERE item_attributes.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM seven_signs WHERE seven_signs.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clanhall_functions WHERE clanhall_functions.hall_id NOT IN (SELECT id FROM clanhall WHERE ownerId <> 0 union all SELECT clanHallId FROM siegable_clanhall WHERE ownerId <> 0);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET taxpercent=0 WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.executeUpdate("UPDATE clanhall SET ownerId=0, paidUntil=0, paid=0 WHERE clanhall.ownerId NOT IN (SELECT clan_id FROM clan_data);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanInvalidWeddings()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
- {
- s.executeUpdate("DELETE FROM mods_wedding WHERE player1Id NOT IN (SELECT charId FROM characters)");
- s.executeUpdate("DELETE FROM mods_wedding WHERE player2Id NOT IN (SELECT charId FROM characters)");
- LOGGER.info("Cleaned up invalid Weddings.");
- }
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up invalid Weddings: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -286,62 +221,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index 52c6368677..0000000000
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index c9ff14fcc4..4304dfc5bd 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -116,7 +116,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 953ed18eb0..77574dcd19 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -254,7 +254,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java
index 893fc4a4bd..681cc6a871 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/instancemanager/MercTicketManager.java
@@ -188,7 +188,7 @@ public class MercTicketManager
{
itemId = ITEM_IDS[i];
// create the ticket in the gameworld
- final ItemInstance dropticket = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance dropticket = new ItemInstance(IdFactory.getNextId(), itemId);
dropticket.setItemLocation(ItemLocation.VOID);
dropticket.dropMe(null, x, y, z);
dropticket.setDropTime(0); // avoids it from being removed by the auto item destroyer
@@ -324,7 +324,7 @@ public class MercTicketManager
castle.getSiege().getSiegeGuardManager().hireMerc(x, y, z, heading, NPC_IDS[i]);
// create the ticket in the gameworld
- final ItemInstance dropticket = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance dropticket = new ItemInstance(IdFactory.getNextId(), itemId);
dropticket.setItemLocation(ItemLocation.VOID);
dropticket.dropMe(null, x, y, z);
dropticket.setDropTime(0); // avoids it from beeing removed by the auto item destroyer
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/AutoSpawnHandler.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/AutoSpawnHandler.java
index 189ba6fff6..2cf6b4e2f7 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/AutoSpawnHandler.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/AutoSpawnHandler.java
@@ -193,7 +193,7 @@ public class AutoSpawnHandler
}
}
- final int newId = IdFactory.getInstance().getNextId();
+ final int newId = IdFactory.getNextId();
newSpawn._objectId = newId;
_registeredSpawns.put(newId, newSpawn);
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Petition.java
index 1ff1d32e0e..b74dfcb361 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Spawn.java
index 12853f63e8..f6aa7acc36 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -566,7 +566,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshId();
initializeNpcInstance(oldNpc);
}
}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/WorldObject.java
index 4257ef3381..6dd39583b4 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -153,11 +153,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 42a3f06c45..018363f32b 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index 8b854f5ee7..d51da51edb 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -52,7 +52,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -285,11 +285,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index 31c6b98e60..d13007c542 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -866,7 +866,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
public void setPvpFlagLasts(long time)
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index e9aa717369..653a737252 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Auction.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Auction.java
index 0f40aa6caa..dd07c11e5f 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Auction.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Auction.java
@@ -352,7 +352,7 @@ public class Auction
{
try (PreparedStatement ps = con.prepareStatement("INSERT INTO auction_bid (id, auctionId, bidderId, bidderName, maxBid, clan_name, time_bid) VALUES (?, ?, ?, ?, ?, ?, ?)"))
{
- ps.setInt(1, IdFactory.getInstance().getNextId());
+ ps.setInt(1, IdFactory.getNextId());
ps.setInt(2, _id);
ps.setInt(3, bidder.getClanId());
ps.setString(4, bidder.getName());
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Couple.java
index b373cf6a96..99cfa4ad6c 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Message.java
index c9495554ed..c85e5028d8 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -95,7 +95,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -113,7 +113,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, SendBySystem sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -133,7 +133,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index b96095a724..3282c1f548 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -221,7 +221,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/olympiad/OlympiadGameTeams.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/olympiad/OlympiadGameTeams.java
index eede88cab2..356da2cab3 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/olympiad/OlympiadGameTeams.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/olympiad/OlympiadGameTeams.java
@@ -75,7 +75,7 @@ public class OlympiadGameTeams extends AbstractOlympiadGame
}
else
{
- _teamOne[i] = new Participant(IdFactory.getInstance().getNextId(), 1);
+ _teamOne[i] = new Participant(IdFactory.getNextId(), 1);
}
if (i < _teamTwoSize)
@@ -89,7 +89,7 @@ public class OlympiadGameTeams extends AbstractOlympiadGame
}
else
{
- _teamTwo[i] = new Participant(IdFactory.getInstance().getNextId(), 2);
+ _teamTwo[i] = new Participant(IdFactory.getNextId(), 2);
}
}
}
@@ -444,7 +444,7 @@ public class OlympiadGameTeams extends AbstractOlympiadGame
}
else
{
- IdFactory.getInstance().releaseId(_teamOne[i].getObjectId());
+ IdFactory.releaseId(_teamOne[i].getObjectId());
}
if (i < _teamTwoSize)
@@ -453,7 +453,7 @@ public class OlympiadGameTeams extends AbstractOlympiadGame
}
else
{
- IdFactory.getInstance().releaseId(_teamTwo[i].getObjectId());
+ IdFactory.releaseId(_teamTwo[i].getObjectId());
}
_teamOne[i] = null;
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index fe65777f2f..ee2437143a 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/util/MinionList.java
index 3d16ba155a..76e1589913 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshID();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/IdFactory.ini b/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java
index e54b35606e..a0153de3de 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -97,7 +96,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -790,9 +788,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int[] AUGMENTATION_BLACKLIST;
@@ -1856,12 +1851,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/GameServer.java
index 91c661e1a1..d05e27b001 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/GameServer.java
@@ -206,7 +206,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -421,7 +422,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 1b1f73736c..67fe013334 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 0ff9b6f6cf..c8f9f73a55 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -210,7 +210,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -328,7 +328,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 74ef0cbe3c..c829d4c58b 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -289,7 +289,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index e17f634829..0d000a730f 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1136,7 +1136,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2ae6979233..7db44a377a 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 59ebe570c6..64cdc0539f 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/config/IdFactory.ini b/L2J_Mobius_Classic_2.1_Zaken/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java
index 44ceb8e179..5cbe91794f 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -97,7 +96,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -790,9 +788,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int[] AUGMENTATION_BLACKLIST;
@@ -1860,12 +1855,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/GameServer.java
index 91c661e1a1..d05e27b001 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/GameServer.java
@@ -206,7 +206,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -421,7 +422,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 1b1f73736c..67fe013334 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 0ff9b6f6cf..c8f9f73a55 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -210,7 +210,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -328,7 +328,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 74ef0cbe3c..c829d4c58b 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -289,7 +289,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index c6474fa19a..a7a61338b8 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1137,7 +1137,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2ae6979233..7db44a377a 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 59ebe570c6..64cdc0539f 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/config/IdFactory.ini b/L2J_Mobius_Classic_2.2_Antharas/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java
index 44ceb8e179..5cbe91794f 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -97,7 +96,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -790,9 +788,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int[] AUGMENTATION_BLACKLIST;
@@ -1860,12 +1855,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/GameServer.java
index 91c661e1a1..d05e27b001 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/GameServer.java
@@ -206,7 +206,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -421,7 +422,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 1b1f73736c..67fe013334 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 6248a56610..12132eb48c 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -211,7 +211,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -329,7 +329,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 6841ad17d8..dd98bb0182 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -289,7 +289,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index d9ed03bcd8..0a96bd5a58 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1135,7 +1135,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2ae6979233..7db44a377a 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 59ebe570c6..64cdc0539f 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/config/IdFactory.ini b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java
index 44ceb8e179..5cbe91794f 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -97,7 +96,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -790,9 +788,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int[] AUGMENTATION_BLACKLIST;
@@ -1860,12 +1855,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/GameServer.java
index 9342008991..c1d4a498d3 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/GameServer.java
@@ -207,7 +207,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -423,7 +424,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 1b1f73736c..67fe013334 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 848b89ce55..131f5fbe3a 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -213,7 +213,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -331,7 +331,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 7d7801d0e0..697452e472 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index 72b14983a2..97e4a1c363 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1145,7 +1145,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2ae6979233..7db44a377a 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 59ebe570c6..64cdc0539f 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/config/IdFactory.ini b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java
index 442f730a9c..f1da5e80a6 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -97,7 +96,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -790,9 +788,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int MIN_ARMOR_ENCHANT_ANNOUNCE;
@@ -1868,12 +1863,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/GameServer.java
index a6322a53a7..7f5a307f8b 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/GameServer.java
@@ -208,7 +208,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -425,7 +426,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 1b1f73736c..67fe013334 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 848b89ce55..131f5fbe3a 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -213,7 +213,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -331,7 +331,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 7d7801d0e0..697452e472 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index 6a89cfd182..a203df7f0c 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1145,7 +1145,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2ae6979233..7db44a377a 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 59ebe570c6..64cdc0539f 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/IdFactory.ini b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java
index 43ef463f63..c4cfff8c1f 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -97,7 +96,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -790,9 +788,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int MIN_ARMOR_ENCHANT_ANNOUNCE;
@@ -1879,12 +1874,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java
index 93f21a9232..77a6a1de19 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java
@@ -210,7 +210,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -429,7 +430,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 1b1f73736c..67fe013334 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 848b89ce55..131f5fbe3a 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -213,7 +213,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -331,7 +331,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 2f0bfe7591..edee1925bd 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -290,7 +290,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index d8bbb6fddb..5fcfdf29f7 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1151,7 +1151,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2ae6979233..7db44a377a 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 59ebe570c6..64cdc0539f 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/config/IdFactory.ini b/L2J_Mobius_Classic_Interlude/dist/game/config/IdFactory.ini
deleted file mode 100644
index d668cf9be2..0000000000
--- a/L2J_Mobius_Classic_Interlude/dist/game/config/IdFactory.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-# ---------------------------------------------------------------------------
-# ID Factory Settings
-# ---------------------------------------------------------------------------
-# Warning:
-# Please take extreme caution when changing anything. Also please understand what you are changing before you do so on a live server.
-
-# ---------------------------------------------------------------------------
-# Standard Settings
-# ---------------------------------------------------------------------------
-
-# Tell server which IDFactory Class to use:
-# BITSET = One non compaction method
-# STACK = Another non compaction method
-# Default: BITSET
-IDFactory = BITSET
-
-# Check for bad ids in the database on server boot up.
-# Much faster load time without it, but may cause problems.
-# Default: True
-BadIdChecking = True
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/bypasshandlers/Loto.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/bypasshandlers/Loto.java
index c01952a945..5a0f543505 100644
--- a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/bypasshandlers/Loto.java
+++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/bypasshandlers/Loto.java
@@ -225,7 +225,7 @@ public class Loto implements IBypassHandler
sm.addItemName(4442);
player.sendPacket(sm);
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4442);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4442);
item.setCount(1);
item.setCustomType1(lotonumber);
item.setEnchantLevel(enchant);
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java
index e9ec783c02..242b4bb2a4 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java
@@ -55,7 +55,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
-import org.l2jmobius.commons.enums.IdFactoryType;
import org.l2jmobius.commons.enums.ServerMode;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.commons.util.PropertiesParser;
@@ -98,7 +97,6 @@ public class Config
private static final String GENERAL_CONFIG_FILE = "./config/General.ini";
private static final String GRACIASEEDS_CONFIG_FILE = "./config/GraciaSeeds.ini";
private static final String GRANDBOSS_CONFIG_FILE = "./config/GrandBoss.ini";
- private static final String IDFACTORY_CONFIG_FILE = "./config/IdFactory.ini";
private static final String LOGIN_CONFIG_FILE = "./config/LoginServer.ini";
private static final String NPC_CONFIG_FILE = "./config/NPC.ini";
private static final String PVP_CONFIG_FILE = "./config/PVP.ini";
@@ -799,9 +797,6 @@ public class Config
public static int MAX_REPUTATION;
public static int REPUTATION_INCREASE;
- public static IdFactoryType IDFACTORY_TYPE;
- public static boolean BAD_ID_CHECKING;
-
public static int[] ENCHANT_BLACKLIST;
public static boolean DISABLE_OVER_ENCHANTING;
public static int[] AUGMENTATION_BLACKLIST;
@@ -1875,12 +1870,6 @@ public class Config
TRAINING_CAMP_EXP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampExpMultiplier", 1.0);
TRAINING_CAMP_SP_MULTIPLIER = trainingCampSettings.getDouble("TrainingCampSpMultiplier", 1.0);
- // Load IdFactory config file (if exists)
- final PropertiesParser IdFactory = new PropertiesParser(IDFACTORY_CONFIG_FILE);
-
- IDFACTORY_TYPE = IdFactory.getEnum("IDFactory", IdFactoryType.class, IdFactoryType.BITSET);
- BAD_ID_CHECKING = IdFactory.getBoolean("BadIdChecking", true);
-
// Load General config file (if exists)
final PropertiesParser General = new PropertiesParser(GENERAL_CONFIG_FILE);
DEFAULT_ACCESS_LEVEL = General.getInt("DefaultAccessLevel", 0);
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/commons/enums/IdFactoryType.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/commons/enums/IdFactoryType.java
deleted file mode 100644
index c1e3bb7b87..0000000000
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/commons/enums/IdFactoryType.java
+++ /dev/null
@@ -1,26 +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 .
- */
-package org.l2jmobius.commons.enums;
-
-/**
- * @author Mobius
- */
-public enum IdFactoryType
-{
- BITSET,
- STACK
-}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/GameServer.java
index 1d7d21f25d..645c308f13 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/GameServer.java
@@ -207,7 +207,8 @@ public class GameServer
ThreadPool.init();
printSection("IdFactory");
- if (!IdFactory.getInstance().isInitialized())
+ IdFactory.init();
+ if (!IdFactory.hasInitialized())
{
LOGGER.severe(getClass().getSimpleName() + ": Could not read object IDs from database. Please check your configuration.");
throw new Exception("Could not initialize the ID factory!");
@@ -423,7 +424,7 @@ public class GameServer
Runtime.getRuntime().addShutdownHook(Shutdown.getInstance());
- LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size());
+ LOGGER.info("IdFactory: Free ObjectID's remaining: " + IdFactory.size());
if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS)
{
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
index 1b1f73736c..67fe013334 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/sql/impl/ClanTable.java
@@ -189,7 +189,7 @@ public class ClanTable
return null;
}
- final Clan clan = new Clan(IdFactory.getInstance().getNextId(), clanName);
+ final Clan clan = new Clan(IdFactory.getNextId(), clanName);
final ClanMember leader = new ClanMember(clan, player);
clan.setLeader(leader);
leader.setPlayerInstance(player);
@@ -264,7 +264,7 @@ public class ClanTable
}
_clans.remove(clanId);
- IdFactory.getInstance().releaseId(clanId);
+ IdFactory.releaseId(clanId);
try (Connection con = DatabaseFactory.getConnection())
{
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/datatables/ItemTable.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/datatables/ItemTable.java
index 0ff9b6f6cf..c8f9f73a55 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/datatables/ItemTable.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/datatables/ItemTable.java
@@ -210,7 +210,7 @@ public class ItemTable
public ItemInstance createItem(String process, int itemId, long count, Creature actor, Object reference)
{
// Create and Init the ItemInstance corresponding to the Item Identifier
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
if (process.equalsIgnoreCase("loot") && !Config.AUTO_LOOT_ITEM_IDS.contains(itemId))
{
@@ -328,7 +328,7 @@ public class ItemTable
item.setLastChange(ItemInstance.REMOVED);
World.getInstance().removeObject(item);
- IdFactory.getInstance().releaseId(item.getObjectId());
+ IdFactory.releaseId(item.getObjectId());
if (Config.LOG_ITEMS)
{
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
deleted file mode 100644
index 82c78c3e1b..0000000000
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/idfactory/BitSetIDFactory.java
+++ /dev/null
@@ -1,151 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.util.BitSet;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.l2jmobius.commons.concurrent.ThreadPool;
-import org.l2jmobius.gameserver.util.PrimeFinder;
-
-/**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
- */
-public class BitSetIDFactory extends IdFactory
-{
- private BitSet _freeIds;
- private AtomicInteger _freeIdCount;
- private AtomicInteger _nextFreeId;
-
- protected class BitSetCapacityCheck implements Runnable
- {
- @Override
- public void run()
- {
- synchronized (BitSetIDFactory.this)
- {
- if (reachingBitSetCapacity())
- {
- increaseBitSetCapacity();
- }
- }
- }
- }
-
- protected BitSetIDFactory()
- {
- super();
-
- synchronized (BitSetIDFactory.class)
- {
- ThreadPool.scheduleAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
- initialize();
- }
- LOGGER.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
- }
-
- public void initialize()
- {
- try
- {
- _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
- _freeIds.clear();
- _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
-
- for (int usedObjectId : extractUsedObjectIDTable())
- {
- final int objectID = usedObjectId - FIRST_OID;
- if (objectID < 0)
- {
- LOGGER.warning(getClass().getSimpleName() + ": 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(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
- }
- }
-
- @Override
- public synchronized void releaseId(int objectID)
- {
- if ((objectID - FIRST_OID) > -1)
- {
- _freeIds.clear(objectID - FIRST_OID);
- _freeIdCount.incrementAndGet();
- }
- else
- {
- LOGGER.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
- }
- }
-
- @Override
- public synchronized int getNextId()
- {
- 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("Ran out of valid Id's.");
- }
- increaseBitSetCapacity();
- }
-
- _nextFreeId.set(nextFree);
-
- return newID + FIRST_OID;
- }
-
- @Override
- public synchronized int size()
- {
- return _freeIdCount.get();
- }
-
- protected synchronized int usedIdCount()
- {
- return _freeIdCount.get() - FIRST_OID;
- }
-
- protected synchronized boolean reachingBitSetCapacity()
- {
- return PrimeFinder.nextPrime((usedIdCount() * 11) / 10) > _freeIds.size();
- }
-
- protected synchronized void increaseBitSetCapacity()
- {
- final BitSet newBitSet = new BitSet(PrimeFinder.nextPrime((usedIdCount() * 11) / 10));
- newBitSet.or(_freeIds);
- _freeIds = newBitSet;
- }
-}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/idfactory/IdFactory.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
index 4940ee3f3e..2483ee26ae 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/idfactory/IdFactory.java
@@ -19,23 +19,25 @@ package org.l2jmobius.gameserver.idfactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collections;
import java.util.List;
-import java.util.logging.Level;
+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;
/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * @author Mobius (reworked from L2J version)
*/
public abstract class IdFactory
{
- protected final Logger LOGGER = Logger.getLogger(getClass().getName());
+ private static final Logger LOGGER = Logger.getLogger(IdFactory.class.getName());
protected static final String[] ID_CHECKS =
{
@@ -64,7 +66,6 @@ public abstract class IdFactory
"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 =
{
@@ -75,183 +76,121 @@ public abstract class IdFactory
{"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 <= ?"
};
-
- protected boolean _initialized;
-
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;
- protected static final IdFactory _instance;
+ private static BitSet _freeIds;
+ private static AtomicInteger _freeIdCount;
+ private static AtomicInteger _nextFreeId;
+ private static boolean _initialized;
- protected IdFactory()
- {
- setAllCharacterOffline();
- if (Config.DATABASE_CLEAN_UP)
- {
- cleanUpDB();
- }
- cleanUpTimeStamps();
- }
-
- static
- {
- switch (Config.IDFACTORY_TYPE)
- {
- case BITSET:
- {
- _instance = new BitSetIDFactory();
- break;
- }
- case STACK:
- {
- _instance = new StackIDFactory();
- break;
- }
- default:
- {
- _instance = null;
- break;
- }
- }
- }
-
- /**
- * Sets all character offline
- */
- private void setAllCharacterOffline()
+ public static void init()
{
+ // Update characters online status.
try (Connection con = DatabaseFactory.getConnection();
Statement s = con.createStatement())
{
s.executeUpdate("UPDATE characters SET online = 0");
LOGGER.info("Updated characters online status.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- LOGGER.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+ LOGGER.warning("IdFactory: Could not update characters online status: " + e);
}
- }
-
- /**
- * Cleans up Database
- */
- private void cleanUpDB()
- {
- try (Connection con = DatabaseFactory.getConnection();
- Statement stmt = con.createStatement())
+
+ // Cleanup database.
+ if (Config.DATABASE_CLEAN_UP)
{
- final long cleanupStart = System.currentTimeMillis();
- int cleanCount = 0;
- // Misc/Account Related
- // Please read the descriptions above each before uncommenting them. If you are still
- // unsure of what exactly it does, leave it commented out. This is for those who know
- // what they are doing. :)
-
- // Deletes only accounts that HAVE been logged into and have no characters associated
- // with the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.lastactive > 0 AND accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes any accounts that don't have characters. Whether or not the player has ever
- // logged into the account.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.login NOT IN (SELECT account_name FROM characters);");
-
- // Deletes banned accounts that have not been logged into for xx amount of days
- // (specified at the end of the script, default is set to 90 days). This prevents
- // accounts from being deleted that were accidentally or temporarily banned.
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM accounts WHERE accounts.accessLevel < 0 AND DATEDIFF(CURRENT_DATE( ) , FROM_UNIXTIME(`lastactive`/1000)) > 90;");
- // cleanCount +=
- // stmt.executeUpdate("DELETE FROM characters WHERE characters.account_name NOT IN (SELECT login FROM accounts);");
-
- // If the character does not exist...
- // Characters
- cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
-
- // Items
- cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
-
- // Misc
- cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
- cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
- cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
-
- // If the clan does not exist...
- cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
- cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
-
- // Forum Related
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
- cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
- cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
- cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
-
- // Update needed items after cleaning has taken place.
- stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
- stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
- stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
- stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
- stmt.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);");
- stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
-
- LOGGER.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement stmt = con.createStatement())
+ {
+ final long cleanupStart = System.currentTimeMillis();
+ int cleanCount = 0;
+
+ // Characters
+ cleanCount += stmt.executeUpdate("DELETE FROM account_gsdata WHERE account_gsdata.account_name NOT IN (SELECT account_name FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_contacts WHERE character_contacts.contactId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_friends WHERE character_friends.friendId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_hennas WHERE character_hennas.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_macroses WHERE character_macroses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_quests WHERE character_quests.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipebook WHERE character_recipebook.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_recipeshoplist WHERE character_recipeshoplist.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_shortcuts WHERE character_shortcuts.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills WHERE character_skills.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_skills_save WHERE character_skills_save.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_subclasses WHERE character_subclasses.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_instance_time WHERE character_instance_time.charId NOT IN (SELECT charId FROM characters);");
+
+ // Items
+ cleanCount += stmt.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 += stmt.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 += stmt.executeUpdate("DELETE FROM item_auction_bid WHERE item_auction_bid.playerObjId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variations WHERE item_variations.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_elementals WHERE item_elementals.itemId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_special_abilities WHERE item_special_abilities.objectId NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM item_variables WHERE item_variables.id NOT IN (SELECT object_id FROM items);");
+
+ // Misc
+ cleanCount += stmt.executeUpdate("DELETE FROM cursed_weapons WHERE cursed_weapons.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes WHERE heroes.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles WHERE olympiad_nobles.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_nobles_eom WHERE olympiad_nobles_eom.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM pets WHERE pets.item_obj_id NOT IN (SELECT object_id FROM items);");
+ cleanCount += stmt.executeUpdate("DELETE FROM merchant_lease WHERE merchant_lease.player_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_reco_bonus WHERE character_reco_bonus.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.leader_id NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_data WHERE clan_data.clan_id NOT IN (SELECT clanid FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charOneId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM olympiad_fights WHERE olympiad_fights.charTwoId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM heroes_diary WHERE heroes_diary.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade WHERE character_offline_trade.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_offline_trade_items WHERE character_offline_trade_items.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_tpbookmark WHERE character_tpbookmark.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM character_variables WHERE character_variables.charId NOT IN (SELECT charId FROM characters);");
+ cleanCount += stmt.executeUpdate("DELETE FROM bot_reported_char_data WHERE bot_reported_char_data.botId NOT IN (SELECT charId FROM characters);");
+
+ // Clan
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_privs WHERE clan_privs.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_skills WHERE clan_skills.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_subpledges WHERE clan_subpledges.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan1 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_wars WHERE clan_wars.clan2 NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM siege_clans WHERE siege_clans.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM clan_notices WHERE clan_notices.clan_id NOT IN (SELECT clan_id FROM clan_data);");
+ cleanCount += stmt.executeUpdate("DELETE FROM auction_bid WHERE auction_bid.bidderId NOT IN (SELECT clan_id FROM clan_data);");
+
+ // Forums
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT clan_id FROM clan_data) AND forums.forum_parent=2;");
+ cleanCount += stmt.executeUpdate("DELETE FROM forums WHERE forums.forum_owner_id NOT IN (SELECT charId FROM characters) AND forums.forum_parent=3;");
+ cleanCount += stmt.executeUpdate("DELETE FROM posts WHERE posts.post_forum_id NOT IN (SELECT forum_id FROM forums);");
+ cleanCount += stmt.executeUpdate("DELETE FROM topic WHERE topic.topic_forum_id NOT IN (SELECT forum_id FROM forums);");
+
+ // Update needed items after cleaning has taken place.
+ stmt.executeUpdate("UPDATE clan_data SET auction_bid_at = 0 WHERE auction_bid_at NOT IN (SELECT auctionId FROM auction_bid);");
+ stmt.executeUpdate("UPDATE clan_data SET new_leader_id = 0 WHERE new_leader_id <> 0 AND new_leader_id NOT IN (SELECT charId FROM characters);");
+ stmt.executeUpdate("UPDATE clan_subpledges SET leader_id=0 WHERE clan_subpledges.leader_id NOT IN (SELECT charId FROM characters) AND leader_id > 0;");
+ stmt.executeUpdate("UPDATE castle SET side='NEUTRAL' WHERE castle.id NOT IN (SELECT hasCastle FROM clan_data);");
+ stmt.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);");
+ stmt.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);
+ }
}
- catch (SQLException e)
- {
- LOGGER.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
- }
- }
-
- private void cleanUpTimeStamps()
- {
+
+ // Cleanup timestamps.
try (Connection con = DatabaseFactory.getConnection())
{
int cleanCount = 0;
@@ -263,62 +202,136 @@ public abstract class IdFactory
cleanCount += stmt.executeUpdate();
}
}
- LOGGER.info("Cleaned " + cleanCount + " expired timestamps from database.");
+ LOGGER.info("IdFactory: Cleaned " + cleanCount + " expired timestamps from database.");
}
- catch (SQLException e)
+ catch (Exception e)
{
- // Ignore.
+ LOGGER.warning("IdFactory: Could not clean expired timestamps from database. " + e);
}
- }
-
- /**
- * @return
- * @throws Exception
- * @throws SQLException
- */
- protected final Integer[] extractUsedObjectIDTable() throws Exception
- {
- final List temp = new ArrayList<>();
- try (Connection con = DatabaseFactory.getConnection();
- Statement s = con.createStatement())
+
+ // Initialize.
+ try
{
- String extractUsedObjectIdsQuery = "";
+ _freeIds = new BitSet(PrimeFinder.nextPrime(100000));
+ _freeIds.clear();
+ _freeIdCount = new AtomicInteger(FREE_OBJECT_ID_SIZE);
- for (String[] tblClmn : ID_EXTRACTS)
+ // Collect already used ids.
+ final List usedIds = new ArrayList<>();
+ try (Connection con = DatabaseFactory.getConnection();
+ Statement statement = con.createStatement())
{
- extractUsedObjectIdsQuery += "SELECT " + tblClmn[1] + " FROM " + tblClmn[0] + " UNION ";
- }
-
- extractUsedObjectIdsQuery = extractUsedObjectIdsQuery.substring(0, extractUsedObjectIdsQuery.length() - 7); // Remove the last " UNION "
- try (ResultSet rs = s.executeQuery(extractUsedObjectIdsQuery))
- {
- while (rs.next())
+ String extractUsedObjectIdsQuery = "";
+ for (String[] tblClmn : ID_EXTRACTS)
{
- temp.add(rs.getInt(1));
+ 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;
}
- Collections.sort(temp);
- return temp.toArray(new Integer[temp.size()]);
+ 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 boolean isInitialized()
+ 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;
}
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- public abstract int getNextId();
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- public abstract void releaseId(int id);
-
- public abstract int size();
}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
deleted file mode 100644
index b3b3c76441..0000000000
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/idfactory/StackIDFactory.java
+++ /dev/null
@@ -1,152 +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 .
- */
-package org.l2jmobius.gameserver.idfactory;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Stack;
-
-import org.l2jmobius.Config;
-import org.l2jmobius.commons.database.DatabaseFactory;
-
-/**
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
- */
-public class StackIDFactory extends IdFactory
-{
- private int _curOID;
- private int _tempOID;
-
- private final Stack _freeOIDStack = new Stack<>();
-
- protected StackIDFactory()
- {
- super();
- _curOID = FIRST_OID;
- _tempOID = FIRST_OID;
-
- try (Connection con = DatabaseFactory.getConnection())
- {
- // con.createStatement().execute("drop table if exists tmp_obj_id");
-
- final Integer[] tmpObjIds = extractUsedObjectIDTable();
- if (tmpObjIds.length > 0)
- {
- _curOID = tmpObjIds[tmpObjIds.length - 1];
- }
- LOGGER.info("Max Id = " + _curOID);
-
- int n = tmpObjIds.length;
- for (int idx = 0; idx < n; idx++)
- {
- n = insertUntil(tmpObjIds, idx, n, con);
- }
-
- _curOID++;
- LOGGER.info("IdFactory: Next usable Object ID is: " + _curOID);
- _initialized = true;
- }
- catch (Exception e)
- {
- LOGGER.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
- }
- }
-
- private int insertUntil(Integer[] tmpObjIds, int idx, int n, Connection con) throws SQLException
- {
- final int id = tmpObjIds[idx];
- if (id == _tempOID)
- {
- _tempOID++;
- return n;
- }
- // check these IDs not present in DB
- if (Config.BAD_ID_CHECKING)
- {
- for (String check : ID_CHECKS)
- {
- try (PreparedStatement ps = con.prepareStatement(check))
- {
- ps.setInt(1, _tempOID);
- // ps.setInt(1, _curOID);
- ps.setInt(2, id);
- try (ResultSet rs = ps.executeQuery())
- {
- if (rs.next())
- {
- final int badId = rs.getInt(1);
- LOGGER.severe("Bad ID " + badId + " in DB found by: " + check);
- throw new RuntimeException();
- }
- }
- }
- }
- }
-
- // int hole = id - _curOID;
- final int hole = (id - _tempOID) > (n - idx) ? n - idx : id - _tempOID;
- for (int i = 1; i <= hole; i++)
- {
- _freeOIDStack.push(_tempOID);
- _tempOID++;
- }
- if (hole < (n - idx))
- {
- _tempOID++;
- }
- return n - hole;
- }
-
- public static IdFactory getInstance()
- {
- return _instance;
- }
-
- @Override
- public synchronized int getNextId()
- {
- int id;
- if (!_freeOIDStack.empty())
- {
- id = _freeOIDStack.pop();
- }
- else
- {
- id = _curOID;
- _curOID += 1;
- }
- return id;
- }
-
- /**
- * return a used Object ID back to the pool
- * @param id
- */
- @Override
- public synchronized void releaseId(int id)
- {
- _freeOIDStack.push(id);
- }
-
- @Override
- public int size()
- {
- return (FREE_OBJECT_ID_SIZE - _curOID) + FIRST_OID + _freeOIDStack.size();
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
index 65a8c52d7e..ff551f92f3 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/AirShipManager.java
@@ -123,7 +123,7 @@ public class AirShipManager
if (_airShips.containsKey(ownerId))
{
airShip = _airShips.get(ownerId);
- airShip.refreshID();
+ airShip.refreshId();
}
else
{
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/MailManager.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
index 2a397f13fa..608df4d247 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/instancemanager/MailManager.java
@@ -282,7 +282,7 @@ public class MailManager
}
_messages.remove(msgId);
- IdFactory.getInstance().releaseId(msgId);
+ IdFactory.releaseId(msgId);
}
/**
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/Petition.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/Petition.java
index a92c6edc42..a4d017e017 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/Petition.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/Petition.java
@@ -47,7 +47,7 @@ public class Petition
public Petition(PlayerInstance petitioner, String petitionText, int petitionType)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_type = PetitionType.values()[--petitionType];
_content = petitionText;
_petitioner = petitioner;
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/Spawn.java
index 6bb54ff154..f2d46ebcd0 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/Spawn.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/Spawn.java
@@ -532,7 +532,7 @@ public class Spawn extends Location implements IIdentifiable, INamable
{
if (_doRespawn)
{
- oldNpc.refreshID();
+ // oldNpc.refreshID();
initializeNpcInstance(oldNpc);
// Register NPC back to instance world.
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/WorldObject.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/WorldObject.java
index 5cbadc4143..16206b420e 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/WorldObject.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/WorldObject.java
@@ -151,11 +151,11 @@ public abstract class WorldObject extends ListenersContainer implements IIdentif
return true;
}
- public void refreshID()
+ public void refreshId()
{
World.getInstance().removeObject(this);
- IdFactory.getInstance().releaseId(getObjectId());
- _objectId = IdFactory.getInstance().getNextId();
+ IdFactory.releaseId(getObjectId());
+ _objectId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Creature.java
index 74ef0cbe3c..c829d4c58b 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Creature.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Creature.java
@@ -289,7 +289,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
public Creature(CreatureTemplate template)
{
- this(IdFactory.getInstance().getNextId(), template);
+ this(IdFactory.getNextId(), template);
}
/**
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
index c62e9306d7..9a06e8ee0c 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/ControllableAirShipInstance.java
@@ -48,7 +48,7 @@ public class ControllableAirShipInstance extends AirShipInstance
super(template);
setInstanceType(InstanceType.ControllableAirShipInstance);
_ownerId = ownerId;
- _helmId = IdFactory.getInstance().getNextId(); // not forget to release !
+ _helmId = IdFactory.getNextId(); // not forget to release !
}
@Override
@@ -281,11 +281,11 @@ public class ControllableAirShipInstance extends AirShipInstance
}
@Override
- public void refreshID()
+ public void refreshId()
{
- super.refreshID();
- IdFactory.getInstance().releaseId(_helmId);
- _helmId = IdFactory.getInstance().getNextId();
+ super.refreshId();
+ IdFactory.releaseId(_helmId);
+ _helmId = IdFactory.getNextId();
}
@Override
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
index fc2fbdb74d..4b655d6905 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/FenceInstance.java
@@ -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)
{
- super(IdFactory.getInstance().getNextId());
+ super(IdFactory.getNextId());
_xMin = x - (width / 2);
_xMax = x + (width / 2);
@@ -62,7 +62,7 @@ public class FenceInstance extends WorldObject
_heightFences = new int[height - 1];
for (int i = 0; i < _heightFences.length; i++)
{
- _heightFences[i] = IdFactory.getInstance().getNextId();
+ _heightFences[i] = IdFactory.getNextId();
}
}
}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index a4bc7e96d9..fde7605a43 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -1139,7 +1139,7 @@ public class PlayerInstance extends Playable
*/
private PlayerInstance(PlayerTemplate template, String accountName, PlayerAppearance app)
{
- this(IdFactory.getInstance().getNextId(), template, accountName, app);
+ this(IdFactory.getNextId(), template, accountName, app);
}
@Override
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
index 2ae6979233..7db44a377a 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/RaceManagerInstance.java
@@ -164,7 +164,7 @@ public class RaceManagerInstance extends Npc
player.setRace(0, 0);
player.setRace(1, 0);
- ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), 4443);
+ ItemInstance item = new ItemInstance(IdFactory.getNextId(), 4443);
item.setCount(1);
item.setEnchantLevel(MonsterRace.getInstance().getRaceNumber());
item.setCustomType1(ticket);
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
index db18c65f51..5e4775c8a8 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/announce/EventAnnouncement.java
@@ -32,7 +32,7 @@ public class EventAnnouncement implements IAnnouncement
public EventAnnouncement(DateRange range, String content)
{
- _id = IdFactory.getInstance().getNextId();
+ _id = IdFactory.getNextId();
_range = range;
_content = content;
}
@@ -88,7 +88,7 @@ public class EventAnnouncement implements IAnnouncement
@Override
public boolean deleteMe()
{
- IdFactory.getInstance().releaseId(_id);
+ IdFactory.releaseId(_id);
return true;
}
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/entity/Couple.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/entity/Couple.java
index d9dfd957ad..6001cca381 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/entity/Couple.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/entity/Couple.java
@@ -34,7 +34,7 @@ public class Couple
{
private static final Logger LOGGER = Logger.getLogger(Couple.class.getName());
- private int _Id = 0;
+ private int _id = 0;
private int _player1Id = 0;
private int _player2Id = 0;
private boolean _maried = false;
@@ -43,12 +43,12 @@ public class Couple
public Couple(int coupleId)
{
- _Id = coupleId;
+ _id = coupleId;
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("SELECT * FROM mods_wedding WHERE id = ?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
try (ResultSet rs = ps.executeQuery())
{
while (rs.next())
@@ -88,8 +88,8 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO mods_wedding (id, player1Id, player2Id, married, affianceDate, weddingDate) VALUES (?, ?, ?, ?, ?, ?)"))
{
- _Id = IdFactory.getInstance().getNextId();
- ps.setInt(1, _Id);
+ _id = IdFactory.getNextId();
+ ps.setInt(1, _id);
ps.setInt(2, _player1Id);
ps.setInt(3, _player2Id);
ps.setBoolean(4, false);
@@ -111,7 +111,7 @@ public class Couple
ps.setBoolean(1, true);
_weddingDate = Calendar.getInstance();
ps.setLong(2, _weddingDate.getTimeInMillis());
- ps.setInt(3, _Id);
+ ps.setInt(3, _id);
ps.execute();
_maried = true;
}
@@ -126,7 +126,7 @@ public class Couple
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM mods_wedding WHERE id=?"))
{
- ps.setInt(1, _Id);
+ ps.setInt(1, _id);
ps.execute();
}
catch (Exception e)
@@ -137,7 +137,7 @@ public class Couple
public int getId()
{
- return _Id;
+ return _id;
}
public int getPlayer1Id()
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/entity/Message.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/entity/Message.java
index 8ffe85a5b3..3d0ace08be 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/entity/Message.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/entity/Message.java
@@ -99,7 +99,7 @@ public class Message
*/
public Message(int senderId, int receiverId, boolean isCod, String subject, String text, long reqAdena)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -118,7 +118,7 @@ public class Message
*/
public Message(int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = subject;
@@ -138,7 +138,7 @@ public class Message
*/
public Message(int senderId, int receiverId, String subject, String content, MailType sendBySystem)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = senderId;
_receiverId = receiverId;
_subject = subject;
@@ -157,7 +157,7 @@ public class Message
*/
public Message(Message msg)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = msg.getSenderId();
_receiverId = msg.getSenderId();
_subject = "";
@@ -177,7 +177,7 @@ public class Message
public Message(int receiverId, ItemInstance item, MailType mailType)
{
- _messageId = IdFactory.getInstance().getNextId();
+ _messageId = IdFactory.getNextId();
_senderId = -1;
_receiverId = receiverId;
_subject = "";
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
index cb554e4dce..85b39b5f70 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/itemauction/AuctionItem.java
@@ -79,7 +79,7 @@ public class AuctionItem
public ItemInstance createNewItemInstance()
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), _itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), _itemId);
World.getInstance().addObject(item);
item.setCount(_itemCount);
item.setEnchantLevel(item.getItem().getDefaultEnchantLevel());
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
index 59ebe570c6..64cdc0539f 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/items/instance/ItemInstance.java
@@ -259,7 +259,7 @@ public class ItemInstance extends WorldObject
*/
public ItemInstance(int itemId)
{
- this(IdFactory.getInstance().getNextId(), itemId);
+ this(IdFactory.getNextId(), itemId);
}
/**
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
index 52fbca7473..effa354acf 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/zone/ZoneForm.java
@@ -50,7 +50,7 @@ public abstract class ZoneForm
protected final void dropDebugItem(int itemId, int num, int x, int y, int z)
{
- final ItemInstance item = new ItemInstance(IdFactory.getInstance().getNextId(), itemId);
+ final ItemInstance item = new ItemInstance(IdFactory.getNextId(), itemId);
item.setCount(num);
item.spawnMe(x, y, z + 5);
ZoneManager.getInstance().getDebugItems().add(item);
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/util/MinionList.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/util/MinionList.java
index 0e0facfe53..c4f1ded4ba 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/util/MinionList.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/util/MinionList.java
@@ -248,7 +248,7 @@ public class MinionList
// minion can be already spawned or deleted
if (!_master.isAlikeDead() && _master.isSpawned() && !_minion.isSpawned())
{
- _minion.refreshID();
+ // _minion.refreshId();
initializeNpcInstance(_master, _minion);
// assist master