Precautionary cancel player tasks and quest timers on disconnect.
This commit is contained in:
+148
-63
@@ -250,6 +250,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;
|
||||
@@ -616,6 +617,8 @@ public class PlayerInstance extends Playable
|
||||
|
||||
private MatchingRoom _matchingRoom;
|
||||
|
||||
private ScheduledFuture<?> _taskWarnUserTakeBreak;
|
||||
|
||||
// Clan related attributes
|
||||
/** The Clan Identifier of the PlayerInstance */
|
||||
private int _clanId;
|
||||
@@ -778,7 +781,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
private volatile long _lastItemAuctionInfoRequest = 0;
|
||||
|
||||
private Future<?> _PvPRegTask;
|
||||
private Future<?> _pvpRegTask;
|
||||
|
||||
private long _pvpFlagLasts;
|
||||
|
||||
@@ -808,29 +811,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;
|
||||
}
|
||||
|
||||
// Training Camp
|
||||
@@ -848,6 +848,8 @@ public class PlayerInstance extends Playable
|
||||
|
||||
private final Set<Integer> _whisperers = ConcurrentHashMap.newKeySet();
|
||||
|
||||
private final List<QuestTimer> _questTimers = new ArrayList<>();
|
||||
|
||||
// Selling buffs system
|
||||
private boolean _isSellingBuffs = false;
|
||||
private List<SellBuffHolder> _sellingBuffs = null;
|
||||
@@ -1622,7 +1624,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isRegisteredOnThisSiegeField(int value)
|
||||
{
|
||||
return (_siegeSide != value) && ((_siegeSide < 81) || (_siegeSide > 89));
|
||||
return (_siegeSide == value) || ((_siegeSide >= 81) && (_siegeSide <= 89));
|
||||
}
|
||||
|
||||
public int getSiegeSide()
|
||||
@@ -1653,12 +1655,8 @@ public class PlayerInstance extends Playable
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (castle.getOwner() == null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return castle.getOwner() == null;
|
||||
}
|
||||
|
||||
// Both are defenders, friends.
|
||||
@@ -3252,14 +3250,10 @@ public class PlayerInstance extends Playable
|
||||
{
|
||||
CursedWeaponsManager.getInstance().activate(this, newitem);
|
||||
}
|
||||
// Combat Flag
|
||||
else if (FortSiegeManager.getInstance().isCombat(item.getId()))
|
||||
else if (FortSiegeManager.getInstance().isCombat(item.getId()) && FortSiegeManager.getInstance().activateCombatFlag(this, item))
|
||||
{
|
||||
if (FortSiegeManager.getInstance().activateCombatFlag(this, item))
|
||||
{
|
||||
final Fort fort = FortManager.getInstance().getFort(this);
|
||||
fort.getSiege().announceToPlayer(new SystemMessage(SystemMessageId.C1_HAS_ACQUIRED_THE_FLAG), getName());
|
||||
}
|
||||
final Fort fort = FortManager.getInstance().getFort(this);
|
||||
fort.getSiege().announceToPlayer(new SystemMessage(SystemMessageId.C1_HAS_ACQUIRED_THE_FLAG), getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4731,11 +4725,7 @@ public class PlayerInstance extends Playable
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if ((armor != null) && ((_inventory.getPaperdollItem(Inventory.PAPERDOLL_CHEST).getItem().getBodyPart() == Item.SLOT_FULL_ARMOR) && (armor.getItemType() == ArmorType.HEAVY)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return (armor != null) && ((_inventory.getPaperdollItem(Inventory.PAPERDOLL_CHEST).getItem().getBodyPart() == Item.SLOT_FULL_ARMOR) && (armor.getItemType() == ArmorType.HEAVY));
|
||||
}
|
||||
|
||||
public boolean isWearingLightArmor()
|
||||
@@ -4746,11 +4736,7 @@ public class PlayerInstance extends Playable
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if ((armor != null) && ((_inventory.getPaperdollItem(Inventory.PAPERDOLL_CHEST).getItem().getBodyPart() == Item.SLOT_FULL_ARMOR) && (armor.getItemType() == ArmorType.LIGHT)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return (armor != null) && ((_inventory.getPaperdollItem(Inventory.PAPERDOLL_CHEST).getItem().getBodyPart() == Item.SLOT_FULL_ARMOR) && (armor.getItemType() == ArmorType.LIGHT));
|
||||
}
|
||||
|
||||
public boolean isWearingMagicArmor()
|
||||
@@ -4761,11 +4747,7 @@ public class PlayerInstance extends Playable
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if ((armor != null) && ((_inventory.getPaperdollItem(Inventory.PAPERDOLL_CHEST).getItem().getBodyPart() == Item.SLOT_FULL_ARMOR) && (armor.getItemType() == ArmorType.MAGIC)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return (armor != null) && ((_inventory.getPaperdollItem(Inventory.PAPERDOLL_CHEST).getItem().getBodyPart() == Item.SLOT_FULL_ARMOR) && (armor.getItemType() == ArmorType.MAGIC));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -5152,9 +5134,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
final UserInfo ui = new UserInfo(this, false);
|
||||
ui.addComponentType(UserInfoType.SOCIAL);
|
||||
sendPacket(ui);
|
||||
broadcastUserInfo(UserInfoType.SOCIAL);
|
||||
checkItemRestriction();
|
||||
}
|
||||
|
||||
@@ -6744,17 +6724,11 @@ public class PlayerInstance extends Playable
|
||||
return _forumMail;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param forum
|
||||
*/
|
||||
public void setMail(Forum forum)
|
||||
{
|
||||
_forumMail = forum;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public Forum getMemo()
|
||||
{
|
||||
if (_forumMemo == null)
|
||||
@@ -6770,9 +6744,6 @@ public class PlayerInstance extends Playable
|
||||
return _forumMemo;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param forum
|
||||
*/
|
||||
public void setMemo(Forum forum)
|
||||
{
|
||||
_forumMemo = forum;
|
||||
@@ -7800,9 +7771,7 @@ public class PlayerInstance extends Playable
|
||||
sendPacket(new HennaInfo(this));
|
||||
|
||||
// Send Server->Client UserInfo packet to this PlayerInstance
|
||||
final UserInfo ui = new UserInfo(this, false);
|
||||
ui.addComponentType(UserInfoType.BASE_STATS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
|
||||
sendPacket(ui);
|
||||
broadcastUserInfo(UserInfoType.BASE_STATS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
|
||||
|
||||
final long remainingTime = getVariables().getLong("HennaDuration" + slot, 0) - System.currentTimeMillis();
|
||||
if ((henna.getDuration() < 0) || (remainingTime > 0))
|
||||
@@ -7892,9 +7861,7 @@ public class PlayerInstance extends Playable
|
||||
sendPacket(new HennaInfo(this));
|
||||
|
||||
// Send Server->Client UserInfo packet to this PlayerInstance
|
||||
final UserInfo ui = new UserInfo(this, false);
|
||||
ui.addComponentType(UserInfoType.BASE_STATS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
|
||||
sendPacket(ui);
|
||||
broadcastUserInfo(UserInfoType.BASE_STATS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
|
||||
|
||||
// Notify to scripts
|
||||
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerHennaAdd(this, henna), this);
|
||||
@@ -8095,7 +8062,11 @@ public class PlayerInstance extends Playable
|
||||
// Check if the attacker is in olympia and olympia start
|
||||
if (attacker.isPlayer() && attacker.getActingPlayer().isInOlympiadMode())
|
||||
{
|
||||
return _inOlympiadMode && _OlympiadStart && (((PlayerInstance) attacker).getOlympiadGameId() == getOlympiadGameId());
|
||||
if (_inOlympiadMode && _OlympiadStart && (((PlayerInstance) attacker).getOlympiadGameId() == getOlympiadGameId()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_isOnCustomEvent && (getTeam() == attacker.getTeam()))
|
||||
@@ -8181,10 +8152,13 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
if ((attacker instanceof DefenderInstance) && (_clan != null))
|
||||
if (attacker instanceof DefenderInstance)
|
||||
{
|
||||
final Siege siege = SiegeManager.getInstance().getSiege(this);
|
||||
return ((siege != null) && siege.checkIsAttacker(_clan));
|
||||
if (_clan != null)
|
||||
{
|
||||
final Siege siege = SiegeManager.getInstance().getSiege(this);
|
||||
return ((siege != null) && siege.checkIsAttacker(_clan));
|
||||
}
|
||||
}
|
||||
|
||||
if (attacker instanceof GuardInstance)
|
||||
@@ -8797,8 +8771,6 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
private ScheduledFuture<?> _taskWarnUserTakeBreak;
|
||||
|
||||
public EnumIntBitmask<ClanPrivilege> getClanPrivileges()
|
||||
{
|
||||
return _clanPrivileges;
|
||||
@@ -10247,7 +10219,7 @@ public class PlayerInstance extends Playable
|
||||
s.updateAndBroadcastStatus(0);
|
||||
});
|
||||
|
||||
// show movie if available
|
||||
// Show movie if available
|
||||
if (_movieHolder != null)
|
||||
{
|
||||
sendPacket(new ExStartScenePlayer(_movieHolder.getMovie()));
|
||||
@@ -10696,6 +10668,7 @@ public class PlayerInstance extends Playable
|
||||
{
|
||||
LOGGER.log(Level.SEVERE, "deleteMe()", e);
|
||||
}
|
||||
|
||||
// Stop the HP/MP/CP Regeneration task (scheduled tasks)
|
||||
try
|
||||
{
|
||||
@@ -13614,6 +13587,118 @@ public class PlayerInstance extends Playable
|
||||
return super.getMoveType();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 ((_taskWarnUserTakeBreak != null) && !_taskWarnUserTakeBreak.isDone() && !_taskWarnUserTakeBreak.isCancelled())
|
||||
{
|
||||
_taskWarnUserTakeBreak.cancel(false);
|
||||
_taskWarnUserTakeBreak = null;
|
||||
}
|
||||
if ((_onlineTimeUpdateTask != null) && !_onlineTimeUpdateTask.isDone() && !_onlineTimeUpdateTask.isCancelled())
|
||||
{
|
||||
_onlineTimeUpdateTask.cancel(false);
|
||||
_onlineTimeUpdateTask = 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);
|
||||
}
|
||||
}
|
||||
|
||||
private void startOnlineTimeUpdateTask()
|
||||
{
|
||||
if (_onlineTimeUpdateTask != null)
|
||||
|
||||
+2
-2
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+7
-8
@@ -167,7 +167,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;
|
||||
|
||||
@@ -1739,21 +1739,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)
|
||||
@@ -2449,14 +2449,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);
|
||||
|
||||
+10
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -91,6 +91,12 @@ public class Disconnection
|
||||
_client = getClient(client, player);
|
||||
_player = getActiveChar(client, player);
|
||||
|
||||
// Stop player tasks.
|
||||
if (_player != null)
|
||||
{
|
||||
_player.stopAllTasks();
|
||||
}
|
||||
|
||||
// Anti Feed
|
||||
AntiFeedManager.getInstance().onDisconnect(_client);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user