Delay tasks for frequent packet broadcasts.

This commit is contained in:
MobiusDevelopment
2022-07-31 02:00:10 +00:00
parent 9280c9ca3a
commit b6fe06aa07
194 changed files with 4346 additions and 2781 deletions
@@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect
player.sendPacket(msg); player.sendPacket(msg);
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -438,6 +438,8 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2303,7 +2305,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -8755,9 +8757,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9577,6 +9586,18 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10018,7 +10039,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -826,18 +843,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -85,7 +85,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -442,7 +441,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Friend list // Friend list
player.sendPacket(new L2FriendList(player)); player.sendPacket(new L2FriendList(player));
@@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -698,7 +697,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect
player.sendPacket(msg); player.sendPacket(msg);
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -440,6 +440,8 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2305,7 +2307,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -8758,9 +8760,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9580,6 +9589,18 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10021,7 +10042,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -826,18 +843,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -87,7 +87,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -447,7 +446,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Friend list // Friend list
player.sendPacket(new L2FriendList(player)); player.sendPacket(new L2FriendList(player));
@@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -698,7 +697,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect
player.sendPacket(msg); player.sendPacket(msg);
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -442,6 +442,8 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2307,7 +2309,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -8760,9 +8762,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9582,6 +9591,18 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10023,7 +10044,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -826,18 +843,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -87,7 +87,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -447,7 +446,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Friend list // Friend list
player.sendPacket(new L2FriendList(player)); player.sendPacket(new L2FriendList(player));
@@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -698,7 +697,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect
player.sendPacket(msg); player.sendPacket(msg);
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -446,6 +446,8 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2315,7 +2317,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -8778,9 +8780,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9596,6 +9605,18 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10037,7 +10058,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -826,18 +843,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -87,7 +87,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -447,7 +446,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Friend list // Friend list
player.sendPacket(new L2FriendList(player)); player.sendPacket(new L2FriendList(player));
@@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -698,7 +697,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect
player.sendPacket(msg); player.sendPacket(msg);
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -444,6 +444,8 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2312,7 +2314,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -8799,9 +8801,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9621,6 +9630,18 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10062,7 +10083,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -826,18 +843,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -88,7 +88,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -448,7 +447,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Friend list // Friend list
player.sendPacket(new L2FriendList(player)); player.sendPacket(new L2FriendList(player));
@@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -648,7 +647,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect
player.sendPacket(msg); player.sendPacket(msg);
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -445,6 +445,8 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2325,7 +2327,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -8812,9 +8814,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9634,6 +9643,18 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10075,7 +10096,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -826,18 +843,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -88,7 +88,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -448,7 +447,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Friend list // Friend list
player.sendPacket(new L2FriendList(player)); player.sendPacket(new L2FriendList(player));
@@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -648,7 +647,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect
player.sendPacket(msg); player.sendPacket(msg);
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -445,6 +445,8 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2325,7 +2327,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -8813,9 +8815,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9635,6 +9644,18 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10081,7 +10102,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -826,18 +843,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -88,7 +88,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -448,7 +447,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Friend list // Friend list
player.sendPacket(new L2FriendList(player)); player.sendPacket(new L2FriendList(player));
@@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -648,7 +647,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -95,7 +94,7 @@ public class ClassChange extends AbstractEffect
player.updateSymbolSealSkills(); player.updateSymbolSealSkills();
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -456,6 +456,8 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2260,7 +2262,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -8841,9 +8843,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9663,6 +9672,18 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10116,7 +10137,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -834,18 +851,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -89,7 +89,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -453,7 +452,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Friend list // Friend list
player.sendPacket(new L2FriendList(player)); player.sendPacket(new L2FriendList(player));
@@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -648,7 +647,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -95,7 +94,7 @@ public class ClassChange extends AbstractEffect
player.updateSymbolSealSkills(); player.updateSymbolSealSkills();
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -16,13 +16,11 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
/** /**
* @author Mobius * @author Mobius
@@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect
return; return;
} }
player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); player.sendUserBoostStat();
player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS));
player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE));
} }
} }
@@ -16,13 +16,11 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
/** /**
* @author Mobius * @author Mobius
@@ -46,8 +44,6 @@ public class VitalityExpRate extends AbstractStatPercentEffect
return; return;
} }
player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); player.sendUserBoostStat();
player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS));
player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE));
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -81,6 +81,7 @@ import org.l2jmobius.gameserver.data.xml.SkillTreeData;
import org.l2jmobius.gameserver.data.xml.SymbolSealData; import org.l2jmobius.gameserver.data.xml.SymbolSealData;
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.enums.AdminTeleportType; import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.enums.BroochJewel; import org.l2jmobius.gameserver.enums.BroochJewel;
import org.l2jmobius.gameserver.enums.CastleSide; import org.l2jmobius.gameserver.enums.CastleSide;
import org.l2jmobius.gameserver.enums.CategoryType; import org.l2jmobius.gameserver.enums.CategoryType;
@@ -312,6 +313,7 @@ import org.l2jmobius.gameserver.network.serverpackets.ExStopScenePlayer;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUseSharedGroupItem; import org.l2jmobius.gameserver.network.serverpackets.ExUseSharedGroupItem;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight;
@@ -453,6 +455,9 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _userBoostStatTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2291,7 +2296,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -8943,9 +8948,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9765,6 +9777,32 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
public void sendUserBoostStat()
{
if (_userBoostStatTask == null)
{
_userBoostStatTask = ThreadPool.schedule(() ->
{
sendPacket(new ExUserBoostStat(this, BonusExpType.VITALITY));
sendPacket(new ExUserBoostStat(this, BonusExpType.BUFFS));
sendPacket(new ExUserBoostStat(this, BonusExpType.PASSIVE));
_userBoostStatTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10218,7 +10256,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -834,18 +851,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -91,7 +91,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -462,7 +461,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Send Equipped Items // Send Equipped Items
player.sendPacket(new ExUserInfoEquipSlot(player)); player.sendPacket(new ExUserInfoEquipSlot(player));
@@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -677,7 +676,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -20,7 +20,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ExperienceData; import org.l2jmobius.gameserver.data.xml.ExperienceData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.enums.ItemGrade; import org.l2jmobius.gameserver.enums.ItemGrade;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
@@ -421,9 +420,7 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
// Send exp bonus change. // Send exp bonus change.
if (containsMask(UserInfoType.VITA_FAME)) if (containsMask(UserInfoType.VITA_FAME))
{ {
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); _player.sendUserBoostStat();
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS));
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE));
} }
return true; return true;
} }
@@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -95,7 +94,7 @@ public class ClassChange extends AbstractEffect
player.updateSymbolSealSkills(); player.updateSymbolSealSkills();
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -16,13 +16,11 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
/** /**
* @author Mobius * @author Mobius
@@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect
return; return;
} }
player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); player.sendUserBoostStat();
player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS));
player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE));
} }
} }
@@ -16,13 +16,11 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
/** /**
* @author Mobius * @author Mobius
@@ -46,8 +44,6 @@ public class VitalityExpRate extends AbstractStatPercentEffect
return; return;
} }
player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); player.sendUserBoostStat();
player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS));
player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE));
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.data.xml.SkillTreeData;
import org.l2jmobius.gameserver.data.xml.SymbolSealData; import org.l2jmobius.gameserver.data.xml.SymbolSealData;
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.enums.AdminTeleportType; import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.enums.BroochJewel; import org.l2jmobius.gameserver.enums.BroochJewel;
import org.l2jmobius.gameserver.enums.CastleSide; import org.l2jmobius.gameserver.enums.CastleSide;
import org.l2jmobius.gameserver.enums.CategoryType; import org.l2jmobius.gameserver.enums.CategoryType;
@@ -318,6 +319,7 @@ import org.l2jmobius.gameserver.network.serverpackets.ExStopScenePlayer;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUseSharedGroupItem; import org.l2jmobius.gameserver.network.serverpackets.ExUseSharedGroupItem;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight;
@@ -466,6 +468,9 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _userBoostStatTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2308,7 +2313,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -8969,9 +8974,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9791,6 +9803,32 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
public void sendUserBoostStat()
{
if (_userBoostStatTask == null)
{
_userBoostStatTask = ThreadPool.schedule(() ->
{
sendPacket(new ExUserBoostStat(this, BonusExpType.VITALITY));
sendPacket(new ExUserBoostStat(this, BonusExpType.BUFFS));
sendPacket(new ExUserBoostStat(this, BonusExpType.PASSIVE));
_userBoostStatTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10245,7 +10283,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -834,18 +851,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -92,7 +92,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -467,7 +466,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Send Equipped Items // Send Equipped Items
player.sendPacket(new ExUserInfoEquipSlot(player)); player.sendPacket(new ExUserInfoEquipSlot(player));
@@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -677,7 +676,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -20,7 +20,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ExperienceData; import org.l2jmobius.gameserver.data.xml.ExperienceData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.enums.ItemGrade; import org.l2jmobius.gameserver.enums.ItemGrade;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
@@ -421,9 +420,7 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
// Send exp bonus change. // Send exp bonus change.
if (containsMask(UserInfoType.VITA_FAME)) if (containsMask(UserInfoType.VITA_FAME))
{ {
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); _player.sendUserBoostStat();
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS));
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE));
} }
return true; return true;
} }
@@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -96,7 +95,7 @@ public class ClassChange extends AbstractEffect
player.updateSymbolSealSkills(); player.updateSymbolSealSkills();
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -16,13 +16,11 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
/** /**
* @author Mobius * @author Mobius
@@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect
return; return;
} }
player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); player.sendUserBoostStat();
player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS));
player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE));
} }
} }
@@ -16,13 +16,11 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
/** /**
* @author Mobius * @author Mobius
@@ -46,8 +44,6 @@ public class VitalityExpRate extends AbstractStatPercentEffect
return; return;
} }
player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); player.sendUserBoostStat();
player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS));
player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE));
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.data.xml.SkillTreeData;
import org.l2jmobius.gameserver.data.xml.SymbolSealData; import org.l2jmobius.gameserver.data.xml.SymbolSealData;
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.enums.AdminTeleportType; import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.enums.BroochJewel; import org.l2jmobius.gameserver.enums.BroochJewel;
import org.l2jmobius.gameserver.enums.CastleSide; import org.l2jmobius.gameserver.enums.CastleSide;
import org.l2jmobius.gameserver.enums.CategoryType; import org.l2jmobius.gameserver.enums.CategoryType;
@@ -318,6 +319,7 @@ import org.l2jmobius.gameserver.network.serverpackets.ExStopScenePlayer;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUseSharedGroupItem; import org.l2jmobius.gameserver.network.serverpackets.ExUseSharedGroupItem;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight;
@@ -467,6 +469,9 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _userBoostStatTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2310,7 +2315,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -9007,9 +9012,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9829,6 +9841,32 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
public void sendUserBoostStat()
{
if (_userBoostStatTask == null)
{
_userBoostStatTask = ThreadPool.schedule(() ->
{
sendPacket(new ExUserBoostStat(this, BonusExpType.VITALITY));
sendPacket(new ExUserBoostStat(this, BonusExpType.BUFFS));
sendPacket(new ExUserBoostStat(this, BonusExpType.PASSIVE));
_userBoostStatTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10283,7 +10321,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -834,18 +851,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -92,7 +92,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -471,7 +470,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Send Equipped Items // Send Equipped Items
player.sendPacket(new ExUserInfoEquipSlot(player)); player.sendPacket(new ExUserInfoEquipSlot(player));
@@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -677,7 +676,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -20,7 +20,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ExperienceData; import org.l2jmobius.gameserver.data.xml.ExperienceData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.enums.ItemGrade; import org.l2jmobius.gameserver.enums.ItemGrade;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
@@ -423,9 +422,7 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
// Send exp bonus change. // Send exp bonus change.
if (containsMask(UserInfoType.VITA_FAME)) if (containsMask(UserInfoType.VITA_FAME))
{ {
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); _player.sendUserBoostStat();
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS));
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE));
} }
return true; return true;
} }
@@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowAll;
import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
@@ -96,7 +95,7 @@ public class ClassChange extends AbstractEffect
player.updateSymbolSealSkills(); player.updateSymbolSealSkills();
player.broadcastUserInfo(); player.broadcastUserInfo();
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new AcquireSkillList(player));
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
player.sendPacket(new ExAcquireAPSkillList(player)); player.sendPacket(new ExAcquireAPSkillList(player));
@@ -19,11 +19,9 @@ package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.enums.StorageType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.effects.AbstractEffect; import org.l2jmobius.gameserver.model.effects.AbstractEffect;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
/** /**
* @author Sdw * @author Sdw
@@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect
effected.getStat().mergeAdd(stat, _amount); effected.getStat().mergeAdd(stat, _amount);
if (effected.isPlayer()) if (effected.isPlayer())
{ {
effected.sendPacket(new ExStorageMaxCount((Player) effected)); effected.getActingPlayer().sendStorageMaxCount();
} }
} }
} }
@@ -16,13 +16,11 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
/** /**
* @author Mobius * @author Mobius
@@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect
return; return;
} }
player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); player.sendUserBoostStat();
player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS));
player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE));
} }
} }
@@ -16,13 +16,11 @@
*/ */
package handlers.effecthandlers; package handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.Stat; import org.l2jmobius.gameserver.model.stats.Stat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
/** /**
* @author Mobius * @author Mobius
@@ -46,8 +44,6 @@ public class VitalityExpRate extends AbstractStatPercentEffect
return; return;
} }
player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); player.sendUserBoostStat();
player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS));
player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE));
} }
} }
@@ -27,11 +27,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.enums.SkillFinishType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.actor.Player;
@@ -93,6 +96,9 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _updateEffectIconTask;
private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean();
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1073,12 +1079,21 @@ public class EffectList
* @param partyOnly {@code true} only party icons need to be updated. * @param partyOnly {@code true} only party icons need to be updated.
*/ */
public void updateEffectIcons(boolean partyOnly) public void updateEffectIcons(boolean partyOnly)
{
if (!partyOnly)
{
_updateAbnormalStatus.compareAndSet(false, true);
}
if (_updateEffectIconTask == null)
{
_updateEffectIconTask = ThreadPool.schedule(() ->
{ {
final Player player = _owner.getActingPlayer(); final Player player = _owner.getActingPlayer();
if (player != null) if (player != null)
{ {
final Party party = player.getParty(); final Party party = player.getParty();
final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); final Optional<AbnormalStatusUpdate> asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty();
final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); final Optional<PartySpelled> ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty();
final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); final Optional<ExOlympiadSpelledInfo> os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty();
if (!_actives.isEmpty()) if (!_actives.isEmpty())
@@ -1139,6 +1154,11 @@ public class EffectList
{ {
_owner.sendPacket(upd); _owner.sendPacket(upd);
} }
_updateAbnormalStatus.set(false);
_updateEffectIconTask = null;
}, 300);
}
} }
/** /**
@@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.data.xml.SkillTreeData;
import org.l2jmobius.gameserver.data.xml.SymbolSealData; import org.l2jmobius.gameserver.data.xml.SymbolSealData;
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.enums.AdminTeleportType; import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.enums.BroochJewel; import org.l2jmobius.gameserver.enums.BroochJewel;
import org.l2jmobius.gameserver.enums.CastleSide; import org.l2jmobius.gameserver.enums.CastleSide;
import org.l2jmobius.gameserver.enums.CategoryType; import org.l2jmobius.gameserver.enums.CategoryType;
@@ -318,6 +319,7 @@ import org.l2jmobius.gameserver.network.serverpackets.ExStopScenePlayer;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUseSharedGroupItem; import org.l2jmobius.gameserver.network.serverpackets.ExUseSharedGroupItem;
import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoAbnormalVisualEffect;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoCubic;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight;
@@ -467,6 +469,9 @@ public class Player extends Playable
private ScheduledFuture<?> _itemListTask; private ScheduledFuture<?> _itemListTask;
private ScheduledFuture<?> _skillListTask; private ScheduledFuture<?> _skillListTask;
private ScheduledFuture<?> _storageCountTask;
private ScheduledFuture<?> _userBoostStatTask;
private ScheduledFuture<?> _abnormalVisualEffectTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
@@ -2310,7 +2315,7 @@ public class Player extends Playable
if (getInventoryLimit() != oldInvLimit) if (getInventoryLimit() != oldInvLimit)
{ {
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
} }
} }
@@ -9035,9 +9040,16 @@ public class Player extends Playable
*/ */
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalVisualEffectTask == null)
{
_abnormalVisualEffectTask = ThreadPool.schedule(() ->
{ {
sendPacket(new ExUserInfoAbnormalVisualEffect(this)); sendPacket(new ExUserInfoAbnormalVisualEffect(this));
broadcastCharInfo(); broadcastCharInfo();
_abnormalVisualEffectTask = null;
}, 50);
}
} }
/** /**
@@ -9857,6 +9869,32 @@ public class Player extends Playable
} }
} }
public void sendStorageMaxCount()
{
if (_storageCountTask == null)
{
_storageCountTask = ThreadPool.schedule(() ->
{
sendPacket(new ExStorageMaxCount(this));
_storageCountTask = null;
}, 300);
}
}
public void sendUserBoostStat()
{
if (_userBoostStatTask == null)
{
_userBoostStatTask = ThreadPool.schedule(() ->
{
sendPacket(new ExUserBoostStat(this, BonusExpType.VITALITY));
sendPacket(new ExUserBoostStat(this, BonusExpType.BUFFS));
sendPacket(new ExUserBoostStat(this, BonusExpType.PASSIVE));
_userBoostStatTask = null;
}, 300);
}
}
/** /**
* 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br> * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<br>
* 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so. * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -10311,7 +10349,7 @@ public class Player extends Playable
sendPacket(new ShortCutInit(this)); sendPacket(new ShortCutInit(this));
broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP));
sendPacket(new SkillCoolTime(this)); sendPacket(new SkillCoolTime(this));
sendPacket(new ExStorageMaxCount(this)); sendStorageMaxCount();
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
} }
finally finally
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -82,6 +86,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _summonPoints = 0; private int _summonPoints = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -192,6 +199,12 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalVisualEffects() public void updateAbnormalVisualEffects()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> World.getInstance().forEachVisibleObject(this, Player.class, player ->
{ {
@@ -214,6 +227,10 @@ public abstract class Summon extends Playable
player.sendPacket(packet); player.sendPacket(packet);
}); });
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -834,18 +851,27 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
final Party party = _owner.getParty(); final Party party = _owner.getParty();
if (party != null) if (party != null)
{ {
party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
} }
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -92,7 +92,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList;
import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExRotation;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm; import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount;
import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
@@ -471,7 +470,7 @@ public class EnterWorld implements IClientIncomingPacket
} }
// Expand Skill // Expand Skill
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
// Send Equipped Items // Send Equipped Items
player.sendPacket(new ExUserInfoEquipSlot(player)); player.sendPacket(new ExUserInfoEquipSlot(player));
@@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone;
import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList;
import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList; import org.l2jmobius.gameserver.network.serverpackets.ExBasicActionList;
import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount;
import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList; import org.l2jmobius.gameserver.network.serverpackets.PledgeSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.ShortCutInit;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
@@ -677,7 +676,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
// If skill is expand type then sends packet: // If skill is expand type then sends packet:
if ((_id >= 1368) && (_id <= 1372)) if ((_id >= 1368) && (_id <= 1372))
{ {
player.sendPacket(new ExStorageMaxCount(player)); player.sendStorageMaxCount();
} }
// Notify scripts of the skill learn. // Notify scripts of the skill learn.
@@ -20,7 +20,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.ExperienceData; import org.l2jmobius.gameserver.data.xml.ExperienceData;
import org.l2jmobius.gameserver.enums.AttributeType; import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.BonusExpType;
import org.l2jmobius.gameserver.enums.ItemGrade; import org.l2jmobius.gameserver.enums.ItemGrade;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CastleManager;
@@ -429,9 +428,7 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
// Send exp bonus change. // Send exp bonus change.
if (containsMask(UserInfoType.VITA_FAME)) if (containsMask(UserInfoType.VITA_FAME))
{ {
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); _player.sendUserBoostStat();
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS));
_player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE));
} }
return true; return true;
@@ -91,8 +91,8 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _effectIconsUpdate; private ScheduledFuture<?> _updateEffectIconTask;
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1377,13 +1377,9 @@ public class EffectList
return; return;
} }
// Check if the previous call hasnt finished, if so, don't send packets uselessly again. if (_updateEffectIconTask == null)
if ((_effectIconsUpdate != null) && !_effectIconsUpdate.isDone())
{ {
return; _updateEffectIconTask = ThreadPool.schedule(() ->
}
// Schedule the icon update packets 500miliseconds ahead, so it can gather-up most of the changes.
_effectIconsUpdate = ThreadPool.schedule(() ->
{ {
AbnormalStatusUpdate asu = null; AbnormalStatusUpdate asu = null;
PartySpelled ps = null; PartySpelled ps = null;
@@ -1506,8 +1502,9 @@ public class EffectList
} }
} }
_effectIconsUpdate = null; _updateEffectIconTask = null;
}, 500); }, 300);
}
} }
private void addIcon(BuffInfo info, AbnormalStatusUpdate asu, PartySpelled ps, PartySpelled psSummon, ExOlympiadSpelledInfo os, boolean isSummon) private void addIcon(BuffInfo info, AbnormalStatusUpdate asu, PartySpelled ps, PartySpelled psSummon, ExOlympiadSpelledInfo os, boolean isSummon)
@@ -389,6 +389,8 @@ public class Player extends Playable
private long _lastAccess; private long _lastAccess;
private long _uptime; private long _uptime;
private ScheduledFuture<?> _skillListTask;
private boolean _subclassLock = false; private boolean _subclassLock = false;
protected int _baseClass; protected int _baseClass;
protected int _activeClass; protected int _activeClass;
@@ -9574,34 +9576,41 @@ public class Player extends Playable
public void sendSkillList() public void sendSkillList()
{ {
boolean isDisabled = false; if (_skillListTask == null)
final SkillList sl = new SkillList();
for (Skill s : getAllSkills())
{ {
if (s == null) _skillListTask = ThreadPool.schedule(() ->
{
boolean isDisabled = false;
final SkillList skillList = new SkillList();
for (Skill skill : getAllSkills())
{
if (skill == null)
{ {
continue; continue;
} }
if (_clan != null) if (_clan != null)
{ {
isDisabled = s.isClanSkill() && (_clan.getReputationScore() < 0); isDisabled = skill.isClanSkill() && (_clan.getReputationScore() < 0);
} }
boolean isEnchantable = SkillData.getInstance().isEnchantable(s.getId()); boolean isEnchantable = SkillData.getInstance().isEnchantable(skill.getId());
if (isEnchantable) if (isEnchantable)
{ {
final EnchantSkillLearn esl = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(s.getId()); final EnchantSkillLearn esl = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(skill.getId());
if ((esl == null) || (s.getLevel() < esl.getBaseLevel())) if ((esl == null) || (skill.getLevel() < esl.getBaseLevel()))
{ {
isEnchantable = false; isEnchantable = false;
} }
} }
sl.addSkill(s.getDisplayId(), s.getDisplayLevel(), s.isPassive(), isDisabled, isEnchantable); skillList.addSkill(skill.getDisplayId(), skill.getDisplayLevel(), skill.isPassive(), isDisabled, isEnchantable);
} }
sendPacket(sl); sendPacket(skillList);
_skillListTask = null;
}, 300);
}
} }
/** /**
@@ -16,7 +16,11 @@
*/ */
package org.l2jmobius.gameserver.model.actor; package org.l2jmobius.gameserver.model.actor;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.threads.ThreadPool;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
@@ -74,6 +78,9 @@ public abstract class Summon extends Playable
private boolean _previousFollowStatus = true; private boolean _previousFollowStatus = true;
protected boolean _restoreSummon = true; protected boolean _restoreSummon = true;
private int _shotsMask = 0; private int _shotsMask = 0;
private ScheduledFuture<?> _abnormalEffectTask;
private ScheduledFuture<?> _statusUpdateTask;
private final AtomicInteger _statusUpdateValue = new AtomicInteger();
// @formatter:off // @formatter:off
private static final int[] PASSIVE_SUMMONS = private static final int[] PASSIVE_SUMMONS =
@@ -189,9 +196,19 @@ public abstract class Summon extends Playable
@Override @Override
public void updateAbnormalEffect() public void updateAbnormalEffect()
{
if (_abnormalEffectTask == null)
{
_abnormalEffectTask = ThreadPool.schedule(() ->
{
if (isSpawned())
{ {
World.getInstance().forEachVisibleObject(this, Player.class, player -> player.sendPacket(new SummonInfo(this, player, 1))); World.getInstance().forEachVisibleObject(this, Player.class, player -> player.sendPacket(new SummonInfo(this, player, 1)));
} }
_abnormalEffectTask = null;
}, 50);
}
}
/** /**
* @return Returns the mountable. * @return Returns the mountable.
@@ -823,19 +840,29 @@ public abstract class Summon extends Playable
return; return;
} }
sendPacket(new PetInfo(this, value)); _statusUpdateValue.set(value);
sendPacket(new PetStatusUpdate(this)); if (_statusUpdateTask == null)
{
_statusUpdateTask = ThreadPool.schedule(() ->
{
if (isSpawned()) if (isSpawned())
{ {
broadcastNpcInfo(value); sendPacket(new PetInfo(this, _statusUpdateValue.get()));
} sendPacket(new PetStatusUpdate(this));
broadcastNpcInfo(_statusUpdateValue.get());
// final Party party = _owner.getParty(); // final Party party = _owner.getParty();
// if (party != null) // if (party != null)
// { // {
// party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); // party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this));
// } // }
updateEffectIcons(true); updateEffectIcons(true);
} }
_statusUpdateTask = null;
}, 50);
}
}
public void broadcastNpcInfo(int value) public void broadcastNpcInfo(int value)
{ {
@@ -91,8 +91,8 @@ public class EffectList
private final Creature _owner; private final Creature _owner;
/** Hidden buffs count, prevents iterations. */ /** Hidden buffs count, prevents iterations. */
private final AtomicInteger _hiddenBuffs = new AtomicInteger(); private final AtomicInteger _hiddenBuffs = new AtomicInteger();
/** Delay task **/
private ScheduledFuture<?> _effectIconsUpdate; private ScheduledFuture<?> _updateEffectIconTask;
/** /**
* Constructor for effect list. * Constructor for effect list.
@@ -1377,13 +1377,9 @@ public class EffectList
return; return;
} }
// Check if the previous call hasnt finished, if so, don't send packets uselessly again. if (_updateEffectIconTask == null)
if ((_effectIconsUpdate != null) && !_effectIconsUpdate.isDone())
{ {
return; _updateEffectIconTask = ThreadPool.schedule(() ->
}
// Schedule the icon update packets 500miliseconds ahead, so it can gather-up most of the changes.
_effectIconsUpdate = ThreadPool.schedule(() ->
{ {
AbnormalStatusUpdate asu = null; AbnormalStatusUpdate asu = null;
PartySpelled ps = null; PartySpelled ps = null;
@@ -1506,8 +1502,9 @@ public class EffectList
} }
} }
_effectIconsUpdate = null; _updateEffectIconTask = null;
}, 500); }, 300);
}
} }
private void addIcon(BuffInfo info, AbnormalStatusUpdate asu, PartySpelled ps, PartySpelled psSummon, ExOlympiadSpelledInfo os, boolean isSummon) private void addIcon(BuffInfo info, AbnormalStatusUpdate asu, PartySpelled ps, PartySpelled psSummon, ExOlympiadSpelledInfo os, boolean isSummon)

Some files were not shown because too many files have changed in this diff Show More