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