Addition of PlayerInstance auto save task.

This commit is contained in:
MobiusDevelopment 2020-01-29 14:41:07 +00:00
parent 9d3904e755
commit c31c85e2a3
3 changed files with 54 additions and 4 deletions

View File

@ -550,6 +550,18 @@ SaveDroppedItemInterval = 60
# WARNING: only works when SaveDroppedItem = False
ClearDroppedItemTable = False
# This is the interval (in minutes), that the gameserver will update a players information such as location.
# The higher you set this number, there will be less character information saving so you will have less accessing of the database and your hard drive(s).
# The lower you set this number, there will be more frequent character information saving so you will have more access to the database and your hard drive(s).
# A value of 0 disables periodic saving.
# Independent of this setting the character is always saved after leaving the world.
# Default: 15
CharacterDataStoreInterval = 15
# When enabled, this forces (even if using lazy item updates) the items owned by the character to be updated into DB when saving its character.
# Default: True
UpdateItemsOnCharStore = True
# Remove broken quests player
AutoDeleteInvalidQuestData = False

View File

@ -194,6 +194,10 @@ public class Config
public static int DUMP_INTERVAL_SECONDS = 60;
public static int DEFAULT_PUNISH;
public static int DEFAULT_PUNISH_PARAM;
public static int CHAR_DATA_STORE_INTERVAL;
public static boolean UPDATE_ITEMS_ON_CHAR_STORE;
public static boolean AUTODELETE_INVALID_QUEST_DATA;
public static boolean GRIDS_ALWAYS_ON;
public static int GRID_NEIGHBOR_TURNON_TIME;
@ -1631,6 +1635,7 @@ public class Config
{
LIST_PROTECTED_ITEMS.add(Integer.parseInt(id));
}
DESTROY_DROPPED_PLAYER_ITEM = Boolean.parseBoolean(generalSettings.getProperty("DestroyPlayerDroppedItem", "false"));
DESTROY_EQUIPABLE_PLAYER_ITEM = Boolean.parseBoolean(generalSettings.getProperty("DestroyEquipableItem", "false"));
SAVE_DROPPED_ITEM = Boolean.parseBoolean(generalSettings.getProperty("SaveDroppedItem", "false"));
@ -1687,6 +1692,9 @@ public class Config
FORCE_COMPLETE_STATUS_UPDATE = Boolean.parseBoolean(generalSettings.getProperty("ForceCompletePlayerStatusUpdate", "true"));
CHAR_DATA_STORE_INTERVAL = Integer.parseInt(generalSettings.getProperty("CharacterDataStoreInterval", "15")) * 60 * 1000;
UPDATE_ITEMS_ON_CHAR_STORE = Boolean.parseBoolean(generalSettings.getProperty("UpdateItemsOnCharStore", "false"));
AUTODELETE_INVALID_QUEST_DATA = Boolean.parseBoolean(generalSettings.getProperty("AutoDeleteInvalidQuestData", "false"));
DELETE_DAYS = Integer.parseInt(generalSettings.getProperty("DeleteCharAfterDays", "7"));

View File

@ -537,6 +537,7 @@ public class PlayerInstance extends Playable
private final HashMap<Integer, Long> confirmDlgRequests = new HashMap<>();
private int _currentMultiSellId = -1;
private int _partyroom = 0;
private Future<?> _autoSaveTask = null;
/** The table containing all minimum level needed for each Expertise (None, D, C, B, A, S). */
private static final int[] EXPERTISE_LEVELS =
@ -602,7 +603,6 @@ public class PlayerInstance extends Playable
// Add the player in the characters table of the database
final boolean ok = player.createDb();
if (!ok)
{
return null;
@ -921,7 +921,6 @@ public class PlayerInstance extends Playable
*/
public class HerbTask implements Runnable
{
/** The _process. */
private final String _process;
@ -8927,6 +8926,8 @@ public class PlayerInstance extends Playable
player.refreshOverloaded();
player.restoreFriendList();
player.startAutoSaveTask();
}
catch (Exception e)
{
@ -9234,8 +9235,7 @@ public class PlayerInstance extends Playable
}
/**
* Update PlayerInstance stats in the characters table of the database.<BR>
* <BR>
* Update PlayerInstance stats in the characters table of the database.
*/
public synchronized void store()
{
@ -10251,6 +10251,34 @@ public class PlayerInstance extends Playable
return _hennaDEX;
}
private void startAutoSaveTask()
{
if ((Config.CHAR_DATA_STORE_INTERVAL > 0) && (_autoSaveTask == null))
{
_autoSaveTask = ThreadPool.scheduleAtFixedRate(this::autoSave, Config.CHAR_DATA_STORE_INTERVAL, Config.CHAR_DATA_STORE_INTERVAL);
}
}
private void stopAutoSaveTask()
{
if (_autoSaveTask != null)
{
_autoSaveTask.cancel(false);
_autoSaveTask = null;
}
}
protected void autoSave()
{
store();
if (Config.UPDATE_ITEMS_ON_CHAR_STORE)
{
_inventory.updateDatabase();
getWarehouse().updateDatabase();
}
}
/**
* Return True if the PlayerInstance is autoAttackable.<BR>
* <BR>
@ -14713,6 +14741,8 @@ public class PlayerInstance extends Playable
// Remove WorldObject object from _allObjects of World
World.getInstance().removeObject(this);
World.getInstance().removeFromAllPlayers(this); // force remove in case of crash during teleport
stopAutoSaveTask();
}
private class ShortBuffTask implements Runnable