Removal of AutoSaveManager as it encourages bad implementations.
This commit is contained in:
@@ -10,29 +10,6 @@
|
|||||||
# DeadLockCheck = -1
|
# DeadLockCheck = -1
|
||||||
# Now the demon-stream after completing his tasks will disappear forever.
|
# Now the demon-stream after completing his tasks will disappear forever.
|
||||||
|
|
||||||
# AUTO SAVE DAEMON:
|
|
||||||
# Allows you to customize the preservation of the database of players.
|
|
||||||
AutoSaveInitial = 300000
|
|
||||||
AutoSaveDelay = 900000
|
|
||||||
|
|
||||||
# CHECK CONNECTION DAEMON:
|
|
||||||
# Allows you to customize the connection check of players.
|
|
||||||
CheckConnectionInitial = 300000
|
|
||||||
CheckConnectionDelay = 900000
|
|
||||||
# Maximum time without receiving packets from client needed to be checked
|
|
||||||
# Default: 60sec
|
|
||||||
CheckConnectionInactivityTime = 60000
|
|
||||||
|
|
||||||
# CHECK TELEPORT ZOMBIE STATUS:
|
|
||||||
# Allow to close connection of "teleport zombies" due to critical errors on teleport
|
|
||||||
# Default: 60sec
|
|
||||||
CheckTeleportZombiesDelay = 60000
|
|
||||||
|
|
||||||
# Clean database task delay:
|
|
||||||
CleanDBInitial = 300000
|
|
||||||
CleanDBDelay = 900000
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Dead Lock Detector (separate thread for detecting deadlocks)
|
# Dead Lock Detector (separate thread for detecting deadlocks)
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
@@ -1120,14 +1120,6 @@ public class Config
|
|||||||
public static ClassMasterSettings CLASS_MASTER_SETTINGS;
|
public static ClassMasterSettings CLASS_MASTER_SETTINGS;
|
||||||
public static boolean ALLOW_REMOTE_CLASS_MASTERS;
|
public static boolean ALLOW_REMOTE_CLASS_MASTERS;
|
||||||
|
|
||||||
public static long AUTOSAVE_INITIAL_TIME;
|
|
||||||
public static long AUTOSAVE_DELAY_TIME;
|
|
||||||
public static long CHECK_CONNECTION_INACTIVITY_TIME;
|
|
||||||
public static long CHECK_CONNECTION_INITIAL_TIME;
|
|
||||||
public static long CHECK_CONNECTION_DELAY_TIME;
|
|
||||||
public static long CLEANDB_INITIAL_TIME;
|
|
||||||
public static long CLEANDB_DELAY_TIME;
|
|
||||||
public static long CHECK_TELEPORT_ZOMBIE_DELAY_TIME;
|
|
||||||
public static long DEADLOCKCHECK_INTIAL_TIME;
|
public static long DEADLOCKCHECK_INTIAL_TIME;
|
||||||
public static long DEADLOCKCHECK_DELAY_TIME;
|
public static long DEADLOCKCHECK_DELAY_TIME;
|
||||||
|
|
||||||
@@ -3491,14 +3483,6 @@ public class Config
|
|||||||
{
|
{
|
||||||
final L2Properties daemonsSettings = new L2Properties(DAEMONS_CONFIG_FILE);
|
final L2Properties daemonsSettings = new L2Properties(DAEMONS_CONFIG_FILE);
|
||||||
|
|
||||||
AUTOSAVE_INITIAL_TIME = Long.parseLong(daemonsSettings.getProperty("AutoSaveInitial", "300000"));
|
|
||||||
AUTOSAVE_DELAY_TIME = Long.parseLong(daemonsSettings.getProperty("AutoSaveDelay", "900000"));
|
|
||||||
CHECK_CONNECTION_INITIAL_TIME = Long.parseLong(daemonsSettings.getProperty("CheckConnectionInitial", "300000"));
|
|
||||||
CHECK_CONNECTION_DELAY_TIME = Long.parseLong(daemonsSettings.getProperty("CheckConnectionDelay", "900000"));
|
|
||||||
CHECK_CONNECTION_INACTIVITY_TIME = Long.parseLong(daemonsSettings.getProperty("CheckConnectionInactivityTime", "90000"));
|
|
||||||
CLEANDB_INITIAL_TIME = Long.parseLong(daemonsSettings.getProperty("CleanDBInitial", "300000"));
|
|
||||||
CLEANDB_DELAY_TIME = Long.parseLong(daemonsSettings.getProperty("CleanDBDelay", "900000"));
|
|
||||||
CHECK_TELEPORT_ZOMBIE_DELAY_TIME = Long.parseLong(daemonsSettings.getProperty("CheckTeleportZombiesDelay", "90000"));
|
|
||||||
DEADLOCKCHECK_INTIAL_TIME = Long.parseLong(daemonsSettings.getProperty("DeadLockCheck", "0"));
|
DEADLOCKCHECK_INTIAL_TIME = Long.parseLong(daemonsSettings.getProperty("DeadLockCheck", "0"));
|
||||||
DEADLOCKCHECK_DELAY_TIME = Long.parseLong(daemonsSettings.getProperty("DeadLockDelay", "0"));
|
DEADLOCKCHECK_DELAY_TIME = Long.parseLong(daemonsSettings.getProperty("DeadLockDelay", "0"));
|
||||||
}
|
}
|
||||||
|
@@ -85,7 +85,6 @@ import org.l2jmobius.gameserver.handler.UserCommandHandler;
|
|||||||
import org.l2jmobius.gameserver.handler.VoicedCommandHandler;
|
import org.l2jmobius.gameserver.handler.VoicedCommandHandler;
|
||||||
import org.l2jmobius.gameserver.idfactory.IdFactory;
|
import org.l2jmobius.gameserver.idfactory.IdFactory;
|
||||||
import org.l2jmobius.gameserver.instancemanager.AuctionManager;
|
import org.l2jmobius.gameserver.instancemanager.AuctionManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.AutoSaveManager;
|
|
||||||
import org.l2jmobius.gameserver.instancemanager.AwayManager;
|
import org.l2jmobius.gameserver.instancemanager.AwayManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.CastleManorManager;
|
import org.l2jmobius.gameserver.instancemanager.CastleManorManager;
|
||||||
@@ -223,11 +222,6 @@ public class GameServer
|
|||||||
ClassDamageManager.loadConfig();
|
ClassDamageManager.loadConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.AUTOSAVE_DELAY_TIME > 0)
|
|
||||||
{
|
|
||||||
AutoSaveManager.getInstance().startAutoSaveManager();
|
|
||||||
}
|
|
||||||
|
|
||||||
Util.printSection("Skills");
|
Util.printSection("Skills");
|
||||||
if (!SkillTable.getInstance().isInitialized())
|
if (!SkillTable.getInstance().isInitialized())
|
||||||
{
|
{
|
||||||
|
@@ -24,7 +24,6 @@ import org.l2jmobius.commons.database.DatabaseBackup;
|
|||||||
import org.l2jmobius.commons.database.DatabaseFactory;
|
import org.l2jmobius.commons.database.DatabaseFactory;
|
||||||
import org.l2jmobius.gameserver.datatables.OfflineTradeTable;
|
import org.l2jmobius.gameserver.datatables.OfflineTradeTable;
|
||||||
import org.l2jmobius.gameserver.datatables.SchemeBufferTable;
|
import org.l2jmobius.gameserver.datatables.SchemeBufferTable;
|
||||||
import org.l2jmobius.gameserver.instancemanager.AutoSaveManager;
|
|
||||||
import org.l2jmobius.gameserver.instancemanager.CastleManorManager;
|
import org.l2jmobius.gameserver.instancemanager.CastleManorManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
|
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
|
||||||
import org.l2jmobius.gameserver.instancemanager.FishingChampionshipManager;
|
import org.l2jmobius.gameserver.instancemanager.FishingChampionshipManager;
|
||||||
@@ -303,8 +302,6 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoSaveManager.getInstance().stopAutoSaveManager();
|
|
||||||
|
|
||||||
// saveData sends messages to exit players, so shutdown selector after it
|
// saveData sends messages to exit players, so shutdown selector after it
|
||||||
saveData();
|
saveData();
|
||||||
|
|
||||||
|
@@ -1,182 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of the L2J Mobius project.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
package org.l2jmobius.gameserver.instancemanager;
|
|
||||||
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.concurrent.ScheduledFuture;
|
|
||||||
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.model.World;
|
|
||||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Shyla
|
|
||||||
*/
|
|
||||||
public class AutoSaveManager
|
|
||||||
{
|
|
||||||
protected static final Logger LOGGER = Logger.getLogger(AutoSaveManager.class.getName());
|
|
||||||
private ScheduledFuture<?> _autoSaveInDB;
|
|
||||||
private ScheduledFuture<?> _autoCheckConnectionStatus;
|
|
||||||
private ScheduledFuture<?> _autoCleanDatabase;
|
|
||||||
|
|
||||||
public static final AutoSaveManager getInstance()
|
|
||||||
{
|
|
||||||
return SingletonHolder.INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AutoSaveManager()
|
|
||||||
{
|
|
||||||
LOGGER.info("Initializing AutoSaveManager");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stopAutoSaveManager()
|
|
||||||
{
|
|
||||||
if (_autoSaveInDB != null)
|
|
||||||
{
|
|
||||||
_autoSaveInDB.cancel(true);
|
|
||||||
_autoSaveInDB = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_autoCheckConnectionStatus != null)
|
|
||||||
{
|
|
||||||
_autoCheckConnectionStatus.cancel(true);
|
|
||||||
_autoCheckConnectionStatus = null;
|
|
||||||
}
|
|
||||||
if (_autoCleanDatabase != null)
|
|
||||||
{
|
|
||||||
_autoCleanDatabase.cancel(true);
|
|
||||||
_autoCleanDatabase = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void startAutoSaveManager()
|
|
||||||
{
|
|
||||||
stopAutoSaveManager();
|
|
||||||
_autoSaveInDB = ThreadPool.scheduleAtFixedRate(new AutoSaveTask(), Config.AUTOSAVE_INITIAL_TIME, Config.AUTOSAVE_DELAY_TIME);
|
|
||||||
_autoCheckConnectionStatus = ThreadPool.scheduleAtFixedRate(new ConnectionCheckTask(), Config.CHECK_CONNECTION_INITIAL_TIME, Config.CHECK_CONNECTION_DELAY_TIME);
|
|
||||||
_autoCleanDatabase = ThreadPool.scheduleAtFixedRate(new AutoCleanDBTask(), Config.CLEANDB_INITIAL_TIME, Config.CLEANDB_DELAY_TIME);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected class AutoSaveTask implements Runnable
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
int playerscount = 0;
|
|
||||||
|
|
||||||
final Collection<PlayerInstance> players = World.getInstance().getAllPlayers();
|
|
||||||
|
|
||||||
for (PlayerInstance player : players)
|
|
||||||
{
|
|
||||||
if (player != null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
playerscount++;
|
|
||||||
player.store();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
LOGGER.warning("Error saving player character: " + player.getName() + " " + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
LOGGER.info("[AutoSaveManager] AutoSaveTask, " + playerscount + " players data saved.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected class ConnectionCheckTask implements Runnable
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
final Collection<PlayerInstance> players = World.getInstance().getAllPlayers();
|
|
||||||
|
|
||||||
for (PlayerInstance player : players)
|
|
||||||
{
|
|
||||||
if ((player != null) && !player.isInOfflineMode())
|
|
||||||
{
|
|
||||||
if ((player.getClient() == null) || (player.isOnline() == 0))
|
|
||||||
{
|
|
||||||
LOGGER.info("[AutoSaveManager] Player " + player.getName() + " status == 0 ---> Closing Connection..");
|
|
||||||
player.store();
|
|
||||||
player.deleteMe();
|
|
||||||
}
|
|
||||||
else if (!player.getClient().isConnectionAlive())
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
LOGGER.info("[AutoSaveManager] Player " + player.getName() + " connection is not alive ---> Closing Connection..");
|
|
||||||
player.getClient().onDisconnection();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
LOGGER.warning("[AutoSaveManager] Error saving player character: " + player.getName() + " " + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (player.checkTeleportOverTime())
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
LOGGER.info("[AutoSaveManager] Player " + player.getName() + " has a teleport overtime ---> Closing Connection..");
|
|
||||||
player.getClient().onDisconnection();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
LOGGER.warning("[AutoSaveManager] Error saving player character: " + player.getName() + " " + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
LOGGER.info("[AutoSaveManager] ConnectionCheckTask, players connections checked.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected class AutoCleanDBTask implements Runnable
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
int erased = 0;
|
|
||||||
|
|
||||||
// Perform the clean here instead of every time that the skills are saved in order to do it in once step because if skill have 0 reuse delay doesn't affect the game, just makes the table grows bigger
|
|
||||||
try (Connection con = DatabaseFactory.getConnection())
|
|
||||||
{
|
|
||||||
PreparedStatement statement;
|
|
||||||
statement = con.prepareStatement("DELETE FROM character_skills_save WHERE reuse_delay=0 && restore_type=1");
|
|
||||||
erased = statement.executeUpdate();
|
|
||||||
statement.close();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
LOGGER.info("[AutoSaveManager] Error while cleaning skill with 0 reuse time from table.");
|
|
||||||
}
|
|
||||||
|
|
||||||
LOGGER.info("[AutoSaveManager] AutoCleanDBTask, " + erased + " entries cleaned from db.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class SingletonHolder
|
|
||||||
{
|
|
||||||
protected static final AutoSaveManager INSTANCE = new AutoSaveManager();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -281,7 +281,6 @@ public class PlayerInstance extends Playable
|
|||||||
private long _voteTimestamp = 0;
|
private long _voteTimestamp = 0;
|
||||||
private PlayerStatsHolder savedStatus = null;
|
private PlayerStatsHolder savedStatus = null;
|
||||||
private final long _instanceLoginTime;
|
private final long _instanceLoginTime;
|
||||||
private long _lastTeleportAction = 0;
|
|
||||||
protected long TOGGLE_USE = 0;
|
protected long TOGGLE_USE = 0;
|
||||||
public int _activeBoxes = -1;
|
public int _activeBoxes = -1;
|
||||||
public List<String> _activeBoxeCharacters = new ArrayList<>();
|
public List<String> _activeBoxeCharacters = new ArrayList<>();
|
||||||
@@ -9387,7 +9386,6 @@ public class PlayerInstance extends Playable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("null")
|
|
||||||
private synchronized void storeEffect()
|
private synchronized void storeEffect()
|
||||||
{
|
{
|
||||||
if (!Config.STORE_SKILL_COOLTIME)
|
if (!Config.STORE_SKILL_COOLTIME)
|
||||||
@@ -9423,7 +9421,7 @@ public class PlayerInstance extends Playable
|
|||||||
}
|
}
|
||||||
storedSkills.add(skillId);
|
storedSkills.add(skillId);
|
||||||
|
|
||||||
if ((effect != null) && effect.getInUse() && !effect.getSkill().isToggle() && !effect.getStackType().equals("BattleForce") && !effect.getStackType().equals("SpellForce") && (effect.getSkill().getSkillType() != SkillType.FORCE_BUFF))
|
if (effect.getInUse() && !effect.getSkill().isToggle() && !effect.getStackType().equals("BattleForce") && !effect.getStackType().equals("SpellForce") && (effect.getSkill().getSkillType() != SkillType.FORCE_BUFF))
|
||||||
{
|
{
|
||||||
statement.setInt(1, getObjectId());
|
statement.setInt(1, getObjectId());
|
||||||
statement.setInt(2, skillId);
|
statement.setInt(2, skillId);
|
||||||
@@ -17249,33 +17247,6 @@ public class PlayerInstance extends Playable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean checkTeleportOverTime()
|
|
||||||
{
|
|
||||||
if (!isTeleporting())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((System.currentTimeMillis() - _lastTeleportAction) > Config.CHECK_TELEPORT_ZOMBIE_DELAY_TIME)
|
|
||||||
{
|
|
||||||
LOGGER.warning("Player " + getName() + " has been in teleport more then " + (Config.CHECK_TELEPORT_ZOMBIE_DELAY_TIME / 1000) + " seconds.. --> Kicking it");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setTeleporting(boolean value)
|
|
||||||
{
|
|
||||||
super.setTeleporting(value);
|
|
||||||
if (value)
|
|
||||||
{
|
|
||||||
_lastTeleportAction = System.currentTimeMillis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlayerInstance getActingPlayer()
|
public PlayerInstance getActingPlayer()
|
||||||
{
|
{
|
||||||
|
@@ -115,8 +115,6 @@ public class GameClient extends MMOClient<MMOConnection<GameClient>> implements
|
|||||||
private final ArrayBlockingQueue<ReceivablePacket<GameClient>> _packetQueue;
|
private final ArrayBlockingQueue<ReceivablePacket<GameClient>> _packetQueue;
|
||||||
private final ReentrantLock _queueLock = new ReentrantLock();
|
private final ReentrantLock _queueLock = new ReentrantLock();
|
||||||
|
|
||||||
private long _last_received_packet_action_time = 0;
|
|
||||||
|
|
||||||
private int _protocolVersion;
|
private int _protocolVersion;
|
||||||
|
|
||||||
public GameClient(MMOConnection<GameClient> con)
|
public GameClient(MMOConnection<GameClient> con)
|
||||||
@@ -929,9 +927,6 @@ public class GameClient extends MMOClient<MMOConnection<GameClient>> implements
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// save last action time
|
|
||||||
_last_received_packet_action_time = System.currentTimeMillis();
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (_state == GameClientState.CONNECTED)
|
if (_state == GameClientState.CONNECTED)
|
||||||
@@ -1002,24 +997,11 @@ public class GameClient extends MMOClient<MMOConnection<GameClient>> implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the _forcedToClose
|
|
||||||
*/
|
|
||||||
public boolean isForcedToClose()
|
public boolean isForcedToClose()
|
||||||
{
|
{
|
||||||
return _forcedToClose;
|
return _forcedToClose;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isConnectionAlive()
|
|
||||||
{
|
|
||||||
if ((System.currentTimeMillis() - _last_received_packet_action_time) > Config.CHECK_CONNECTION_INACTIVITY_TIME)
|
|
||||||
{
|
|
||||||
_last_received_packet_action_time = System.currentTimeMillis();
|
|
||||||
return getConnection().isConnected() && !getConnection().isClosed();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProtocolVersion(int version)
|
public void setProtocolVersion(int version)
|
||||||
{
|
{
|
||||||
_protocolVersion = version;
|
_protocolVersion = version;
|
||||||
|
Reference in New Issue
Block a user