Precautionary cancel player tasks and quest timers on disconnect.

This commit is contained in:
MobiusDevelopment
2020-03-31 11:01:32 +00:00
parent 5fe7e70c08
commit 39d35b111f
103 changed files with 2875 additions and 1022 deletions

View File

@@ -253,6 +253,7 @@ import org.l2jmobius.gameserver.model.punishment.PunishmentTask;
import org.l2jmobius.gameserver.model.punishment.PunishmentType;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.BuffInfo;
import org.l2jmobius.gameserver.model.skills.CommonSkill;
@@ -623,6 +624,8 @@ public class PlayerInstance extends Playable
private MatchingRoom _matchingRoom;
private ScheduledFuture<?> _taskWarnUserTakeBreak;
// Clan related attributes
/** The Clan Identifier of the PlayerInstance */
private int _clanId;
@@ -786,7 +789,7 @@ public class PlayerInstance extends Playable
private volatile long _lastItemAuctionInfoRequest = 0;
private Future<?> _PvPRegTask;
private Future<?> _pvpRegTask;
private long _pvpFlagLasts;
@@ -816,29 +819,26 @@ public class PlayerInstance extends Playable
public void startPvPFlag()
{
updatePvPFlag(1);
if (_PvPRegTask == null)
if (_pvpRegTask == null)
{
_PvPRegTask = ThreadPool.scheduleAtFixedRate(new PvPFlagTask(this), 1000, 1000);
_pvpRegTask = ThreadPool.scheduleAtFixedRate(new PvPFlagTask(this), 1000, 1000);
}
}
public void stopPvpRegTask()
{
if (_PvPRegTask != null)
if (_pvpRegTask != null)
{
_PvPRegTask.cancel(true);
_PvPRegTask = null;
_pvpRegTask.cancel(true);
_pvpRegTask = null;
}
}
public void stopPvPFlag()
{
stopPvpRegTask();
updatePvPFlag(0);
_PvPRegTask = null;
_pvpRegTask = null;
}
// Monster Book variables
@@ -869,6 +869,8 @@ public class PlayerInstance extends Playable
private ScheduledFuture<?> _timedHuntingZoneFinishTask = null;
private final List<QuestTimer> _questTimers = new ArrayList<>();
// Selling buffs system
private boolean _isSellingBuffs = false;
private List<SellBuffHolder> _sellingBuffs = null;
@@ -8788,8 +8790,6 @@ public class PlayerInstance extends Playable
}
}
private ScheduledFuture<?> _taskWarnUserTakeBreak;
public EnumIntBitmask<ClanPrivilege> getClanPrivileges()
{
return _clanPrivileges;
@@ -10690,6 +10690,7 @@ public class PlayerInstance extends Playable
{
LOGGER.log(Level.SEVERE, "deleteMe()", e);
}
// Stop the HP/MP/CP Regeneration task (scheduled tasks)
try
{
@@ -13682,6 +13683,128 @@ public class PlayerInstance extends Playable
return isInParty() ? (_party.isInCommandChannel() ? GroupType.COMMAND_CHANNEL : GroupType.PARTY) : GroupType.NONE;
}
/**
* Precautionary method to end all tasks upon disconnection.
* @TODO: Rework stopAllTimers() method.
*/
public void stopAllTasks()
{
if ((_mountFeedTask != null) && !_mountFeedTask.isDone() && !_mountFeedTask.isCancelled())
{
_mountFeedTask.cancel(false);
_mountFeedTask = null;
}
if ((_dismountTask != null) && !_dismountTask.isDone() && !_dismountTask.isCancelled())
{
_dismountTask.cancel(false);
_dismountTask = null;
}
if ((_fameTask != null) && !_fameTask.isDone() && !_fameTask.isCancelled())
{
_fameTask.cancel(false);
_fameTask = null;
}
if ((_teleportWatchdog != null) && !_teleportWatchdog.isDone() && !_teleportWatchdog.isCancelled())
{
_teleportWatchdog.cancel(false);
_teleportWatchdog = null;
}
if ((_recoGiveTask != null) && !_recoGiveTask.isDone() && !_recoGiveTask.isCancelled())
{
_recoGiveTask.cancel(false);
_recoGiveTask = null;
}
if ((_chargeTask != null) && !_chargeTask.isDone() && !_chargeTask.isCancelled())
{
_chargeTask.cancel(false);
_chargeTask = null;
}
if ((_soulTask != null) && !_soulTask.isDone() && !_soulTask.isCancelled())
{
_soulTask.cancel(false);
_soulTask = null;
}
if ((_taskRentPet != null) && !_taskRentPet.isDone() && !_taskRentPet.isCancelled())
{
_taskRentPet.cancel(false);
_taskRentPet = null;
}
if ((_taskWater != null) && !_taskWater.isDone() && !_taskWater.isCancelled())
{
_taskWater.cancel(false);
_taskWater = null;
}
if ((_fallingDamageTask != null) && !_fallingDamageTask.isDone() && !_fallingDamageTask.isCancelled())
{
_fallingDamageTask.cancel(false);
_fallingDamageTask = null;
}
if ((_pvpRegTask != null) && !_pvpRegTask.isDone() && !_pvpRegTask.isCancelled())
{
_pvpRegTask.cancel(false);
_pvpRegTask = null;
}
if ((_autoSaveTask != null) && !_autoSaveTask.isDone() && !_autoSaveTask.isCancelled())
{
_autoSaveTask.cancel(false);
_autoSaveTask = null;
}
if ((_autoPlayTask != null) && !_autoPlayTask.isDone() && !_autoPlayTask.isCancelled())
{
_autoPlayTask.cancel(false);
_autoPlayTask = null;
}
if ((_autoUseTask != null) && !_autoUseTask.isDone() && !_autoUseTask.isCancelled())
{
_autoUseTask.cancel(false);
_autoUseTask = null;
}
if ((_timedHuntingZoneFinishTask != null) && !_timedHuntingZoneFinishTask.isDone() && !_timedHuntingZoneFinishTask.isCancelled())
{
_timedHuntingZoneFinishTask.cancel(false);
_timedHuntingZoneFinishTask = null;
}
if ((_taskWarnUserTakeBreak != null) && !_taskWarnUserTakeBreak.isDone() && !_taskWarnUserTakeBreak.isCancelled())
{
_taskWarnUserTakeBreak.cancel(false);
_taskWarnUserTakeBreak = null;
}
for (Entry<Integer, ScheduledFuture<?>> entry : _hennaRemoveSchedules.entrySet())
{
final ScheduledFuture<?> task = entry.getValue();
if ((task != null) && !task.isCancelled() && !task.isDone())
{
task.cancel(false);
}
_hennaRemoveSchedules.remove(entry.getKey());
}
synchronized (_questTimers)
{
for (QuestTimer timer : _questTimers)
{
timer.cancel();
}
_questTimers.clear();
}
}
public void addQuestTimer(QuestTimer questTimer)
{
synchronized (_questTimers)
{
_questTimers.add(questTimer);
}
}
public void removeQuestTimer(QuestTimer questTimer)
{
synchronized (_questTimers)
{
_questTimers.remove(questTimer);
}
}
public boolean isTrueHero()
{
return _trueHero;
@@ -13699,7 +13822,15 @@ public class PlayerInstance extends Playable
public int getFactionLevel(Faction faction)
{
return 5;
final int currentPoints = getFactionPoints(faction);
for (int i = 0; i < faction.getLevelCount(); i++)
{
if (currentPoints <= faction.getPointsOfLevel(i))
{
return i;
}
}
return 0;
}
public float getFactionProgress(Faction faction)

View File

@@ -477,7 +477,7 @@ public abstract class ItemContainer
item.updateDatabase();
refreshWeight();
item.deleteMe();
item.stopAllTasks();
}
}
return item;
@@ -590,7 +590,7 @@ public abstract class ItemContainer
for (ItemInstance item : _items.values())
{
item.updateDatabase(true);
item.deleteMe();
item.stopAllTasks();
World.getInstance().removeObject(item);
}
}

View File

@@ -149,7 +149,7 @@ public class Mail extends ItemContainer
for (ItemInstance item : _items.values())
{
item.updateDatabase(true);
item.deleteMe();
item.stopAllTasks();
World.getInstance().removeObject(item);
}

View File

@@ -170,7 +170,7 @@ public class ItemInstance extends WorldObject
private Map<AttributeType, AttributeHolder> _elementals = null;
private ScheduledFuture<?> itemLootShedule = null;
private ScheduledFuture<?> _itemLootShedule = null;
private ScheduledFuture<?> _lifeTimeTask;
private ScheduledFuture<?> _appearanceLifeTimeTask;
@@ -1750,21 +1750,21 @@ public class ItemInstance extends WorldObject
public void resetOwnerTimer()
{
if (itemLootShedule != null)
if (_itemLootShedule != null)
{
itemLootShedule.cancel(true);
itemLootShedule = null;
_itemLootShedule.cancel(true);
_itemLootShedule = null;
}
}
public void setItemLootShedule(ScheduledFuture<?> sf)
{
itemLootShedule = sf;
_itemLootShedule = sf;
}
public ScheduledFuture<?> getItemLootShedule()
{
return itemLootShedule;
return _itemLootShedule;
}
public void setProtected(boolean isProtected)
@@ -2463,14 +2463,13 @@ public class ItemInstance extends WorldObject
{
}
public void deleteMe()
public void stopAllTasks()
{
if ((_lifeTimeTask != null) && !_lifeTimeTask.isDone())
{
_lifeTimeTask.cancel(false);
_lifeTimeTask = null;
}
if ((_appearanceLifeTimeTask != null) && !_appearanceLifeTimeTask.isDone())
{
_appearanceLifeTimeTask.cancel(false);

View File

@@ -47,6 +47,11 @@ public class QuestTimer
{
_scheduler = ThreadPool.schedule(new ScheduleTimerTask(), time); // Prepare auto end task
}
if (player != null)
{
player.addQuestTimer(this);
}
}
public void cancel()
@@ -57,6 +62,11 @@ public class QuestTimer
_scheduler = null;
}
if (_player != null)
{
_player.removeQuestTimer(this);
}
_quest.removeQuestTimer(this);
}

View File

@@ -94,9 +94,7 @@ public class Disconnection
// Stop player tasks.
if (_player != null)
{
_player.stopTimedHuntingZoneTask();
_player.stopAutoPlayTask();
_player.stopAutoUseTask();
_player.stopAllTasks();
}
// Anti Feed