diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index c8be1b6d31..57f3d5f41b 100644 --- a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java index 075bfa4dce..fe4c3531ad 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -438,6 +438,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2303,7 +2305,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8756,8 +8758,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Summon.java index d0de23d7c3..2f7d5c45ea 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 5e60a4b604..bf1af5fa15 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -85,7 +85,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -442,7 +441,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 2874f01354..1a7c2f8c7c 100644 --- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index c8be1b6d31..57f3d5f41b 100644 --- a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java index b030811206..3426b1fe6c 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -440,6 +440,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2305,7 +2307,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8759,8 +8761,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Summon.java index d0de23d7c3..2f7d5c45ea 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 84975b8913..9a83e40d5e 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -87,7 +87,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -447,7 +446,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 80f5ec3ec3..b77a51a32e 100644 --- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index c8be1b6d31..57f3d5f41b 100644 --- a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java index b02ecfeb28..1aeeb36423 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -442,6 +442,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2307,7 +2309,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8761,8 +8763,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Summon.java index d0de23d7c3..2f7d5c45ea 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 84975b8913..9a83e40d5e 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -87,7 +87,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -447,7 +446,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 80f5ec3ec3..b77a51a32e 100644 --- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index c8be1b6d31..57f3d5f41b 100644 --- a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java index 1c8a096e5a..8c8009fe25 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -446,6 +446,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2315,7 +2317,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8779,8 +8781,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Summon.java index d0de23d7c3..2f7d5c45ea 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 571a24d7b0..1c9613e57f 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -87,7 +87,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -447,7 +446,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 80f5ec3ec3..b77a51a32e 100644 --- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index c8be1b6d31..57f3d5f41b 100644 --- a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java index 1bd2bbfb9a..8770fdaec4 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -444,6 +444,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2312,7 +2314,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8800,8 +8802,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Summon.java index d0de23d7c3..2f7d5c45ea 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index d6250c86be..6b649d0b14 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -88,7 +88,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -448,7 +447,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 9e0914fdeb..08ddcc4639 100644 --- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index c8be1b6d31..57f3d5f41b 100644 --- a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java index dcba043654..65038a497b 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -445,6 +445,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2325,7 +2327,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8813,8 +8815,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Summon.java index d0de23d7c3..2f7d5c45ea 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 6342b1d523..7232266244 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -88,7 +88,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -448,7 +447,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index bf2f2494b4..2ee884db0d 100644 --- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index c8be1b6d31..57f3d5f41b 100644 --- a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -92,7 +91,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java index 274bafe08d..35b5c104d8 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -445,6 +445,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2325,7 +2327,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8814,8 +8816,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Summon.java index d0de23d7c3..2f7d5c45ea 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 6342b1d523..7232266244 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -88,7 +88,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -448,7 +447,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index bf2f2494b4..2ee884db0d 100644 --- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index c146ee3ea9..d8731dcd0a 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -95,7 +94,7 @@ public class ClassChange extends AbstractEffect player.updateSymbolSealSkills(); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java index 941ecb211e..222afe39d9 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -456,6 +456,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2260,7 +2262,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8842,8 +8844,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Summon.java index 3c32eb4d37..f29ff1789b 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -834,16 +851,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 142698a157..fe528f9f7b 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -89,7 +89,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -453,7 +452,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 3733359006..f14c4da587 100644 --- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index c146ee3ea9..d8731dcd0a 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -95,7 +94,7 @@ public class ClassChange extends AbstractEffect player.updateSymbolSealSkills(); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java index 6b8d6071b8..cab11b1adc 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java index a2cb18f6f4..1277b9b8c0 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -39,15 +37,13 @@ public class VitalityExpRate extends AbstractStatPercentEffect { effected.getStat().mergeMul(Stat.VITALITY_EXP_RATE, (_amount / 100) + 1); effected.getStat().mergeAdd(Stat.VITALITY_SKILLS, 1); - + final Player player = effected.getActingPlayer(); if (player == null) { return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java index 84650c6240..e9fef38650 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -81,6 +81,7 @@ import org.l2jmobius.gameserver.data.xml.SkillTreeData; import org.l2jmobius.gameserver.data.xml.SymbolSealData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.enums.AdminTeleportType; +import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.BroochJewel; import org.l2jmobius.gameserver.enums.CastleSide; 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.ExSubjobInfo; 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.ExUserInfoCubic; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight; @@ -453,6 +455,9 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _userBoostStatTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2291,7 +2296,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8944,8 +8949,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Summon.java index 3c32eb4d37..f29ff1789b 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -834,16 +851,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 74efe2153d..379a1519d3 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -91,7 +91,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -462,7 +461,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Send Equipped Items player.sendPacket(new ExUserInfoEquipSlot(player)); diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 0e8fbf94fe..f7ea9c3578 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java index b180919aa8..2476a2271a 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java @@ -20,7 +20,6 @@ import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.xml.ExperienceData; import org.l2jmobius.gameserver.enums.AttributeType; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.ItemGrade; import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.instancemanager.CastleManager; @@ -421,9 +420,7 @@ public class UserInfo extends AbstractMaskPacket // Send exp bonus change. if (containsMask(UserInfoType.VITA_FAME)) { - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE)); + _player.sendUserBoostStat(); } return true; } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index c146ee3ea9..d8731dcd0a 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -95,7 +94,7 @@ public class ClassChange extends AbstractEffect player.updateSymbolSealSkills(); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java index 6b8d6071b8..cab11b1adc 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java index a2cb18f6f4..1277b9b8c0 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -39,15 +37,13 @@ public class VitalityExpRate extends AbstractStatPercentEffect { effected.getStat().mergeMul(Stat.VITALITY_EXP_RATE, (_amount / 100) + 1); effected.getStat().mergeAdd(Stat.VITALITY_SKILLS, 1); - + final Player player = effected.getActingPlayer(); if (player == null) { return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/EffectList.java index bc08507351..4c89f9fa5d 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java index 9c6134fcb8..2fbe6b5ab6 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.data.xml.SkillTreeData; import org.l2jmobius.gameserver.data.xml.SymbolSealData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.enums.AdminTeleportType; +import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.BroochJewel; import org.l2jmobius.gameserver.enums.CastleSide; 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.ExSubjobInfo; 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.ExUserInfoCubic; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight; @@ -466,6 +468,9 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _userBoostStatTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2308,7 +2313,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8970,8 +8975,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Summon.java index 3c32eb4d37..f29ff1789b 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -834,16 +851,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index b38f3ccdfa..94423f57ad 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -92,7 +92,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -467,7 +466,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Send Equipped Items player.sendPacket(new ExUserInfoEquipSlot(player)); diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 0e8fbf94fe..f7ea9c3578 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java index b180919aa8..2476a2271a 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java @@ -20,7 +20,6 @@ import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.xml.ExperienceData; import org.l2jmobius.gameserver.enums.AttributeType; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.ItemGrade; import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.instancemanager.CastleManager; @@ -421,9 +420,7 @@ public class UserInfo extends AbstractMaskPacket // Send exp bonus change. if (containsMask(UserInfoType.VITA_FAME)) { - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE)); + _player.sendUserBoostStat(); } return true; } diff --git a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index be4ca67b83..4700756b71 100644 --- a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -96,7 +95,7 @@ public class ClassChange extends AbstractEffect player.updateSymbolSealSkills(); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java index 6b8d6071b8..cab11b1adc 100644 --- a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java +++ b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java index a2cb18f6f4..1277b9b8c0 100644 --- a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java +++ b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -39,15 +37,13 @@ public class VitalityExpRate extends AbstractStatPercentEffect { effected.getStat().mergeMul(Stat.VITALITY_EXP_RATE, (_amount / 100) + 1); effected.getStat().mergeAdd(Stat.VITALITY_SKILLS, 1); - + final Player player = effected.getActingPlayer(); if (player == null) { return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/EffectList.java index bc08507351..4c89f9fa5d 100644 --- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java index 702cee6fdc..8150f4a20f 100644 --- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.data.xml.SkillTreeData; import org.l2jmobius.gameserver.data.xml.SymbolSealData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.enums.AdminTeleportType; +import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.BroochJewel; import org.l2jmobius.gameserver.enums.CastleSide; 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.ExSubjobInfo; 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.ExUserInfoCubic; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight; @@ -467,6 +469,9 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _userBoostStatTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2310,7 +2315,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -9008,8 +9013,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/actor/Summon.java index 3f5830eddb..ba80dbbc2f 100644 --- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -834,16 +851,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 26e8d9aa01..f55034b49f 100644 --- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -92,7 +92,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -471,7 +470,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Send Equipped Items player.sendPacket(new ExUserInfoEquipSlot(player)); diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 5930a73489..5c372ef660 100644 --- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java index 227196de26..036068c86f 100644 --- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java +++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java @@ -20,7 +20,6 @@ import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.xml.ExperienceData; import org.l2jmobius.gameserver.enums.AttributeType; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.ItemGrade; import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.instancemanager.CastleManager; @@ -423,9 +422,7 @@ public class UserInfo extends AbstractMaskPacket // Send exp bonus change. if (containsMask(UserInfoType.VITA_FAME)) { - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE)); + _player.sendUserBoostStat(); } return true; } diff --git a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index be4ca67b83..4700756b71 100644 --- a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -96,7 +95,7 @@ public class ClassChange extends AbstractEffect player.updateSymbolSealSkills(); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); player.sendPacket(new ExAcquireAPSkillList(player)); diff --git a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java index 6b8d6071b8..cab11b1adc 100644 --- a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java +++ b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java index a2cb18f6f4..1277b9b8c0 100644 --- a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java +++ b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -39,15 +37,13 @@ public class VitalityExpRate extends AbstractStatPercentEffect { effected.getStat().mergeMul(Stat.VITALITY_EXP_RATE, (_amount / 100) + 1); effected.getStat().mergeAdd(Stat.VITALITY_SKILLS, 1); - + final Player player = effected.getActingPlayer(); if (player == null) { return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/EffectList.java index bc08507351..4c89f9fa5d 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java index eb31cb5577..3eb2ea2305 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.data.xml.SkillTreeData; import org.l2jmobius.gameserver.data.xml.SymbolSealData; import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; import org.l2jmobius.gameserver.enums.AdminTeleportType; +import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.BroochJewel; import org.l2jmobius.gameserver.enums.CastleSide; 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.ExSubjobInfo; 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.ExUserInfoCubic; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoInvenWeight; @@ -467,6 +469,9 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _userBoostStatTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2310,7 +2315,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -9036,8 +9041,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + 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 three) for this character.
* 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)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Summon.java index 3f5830eddb..ba80dbbc2f 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -834,16 +851,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 26e8d9aa01..f55034b49f 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -92,7 +92,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; 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.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -471,7 +470,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Send Equipped Items player.sendPacket(new ExUserInfoEquipSlot(player)); diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 5930a73489..5c372ef660 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -50,7 +50,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; 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 ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java index 6d0101c829..7a5d760f1f 100644 --- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java +++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java @@ -20,7 +20,6 @@ import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.xml.ExperienceData; import org.l2jmobius.gameserver.enums.AttributeType; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.ItemGrade; import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.instancemanager.CastleManager; @@ -429,9 +428,7 @@ public class UserInfo extends AbstractMaskPacket // Send exp bonus change. if (containsMask(UserInfoType.VITA_FAME)) { - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE)); + _player.sendUserBoostStat(); } return true; diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/EffectList.java index 0fa026f393..8fbebb5a3a 100644 --- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/EffectList.java @@ -91,8 +91,8 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); - - private ScheduledFuture _effectIconsUpdate; + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; /** * Constructor for effect list. @@ -1377,137 +1377,134 @@ public class EffectList return; } - // Check if the previous call hasnt finished, if so, don't send packets uselessly again. - if ((_effectIconsUpdate != null) && !_effectIconsUpdate.isDone()) + if (_updateEffectIconTask == null) { - return; - } - // Schedule the icon update packets 500miliseconds ahead, so it can gather-up most of the changes. - _effectIconsUpdate = ThreadPool.schedule(() -> - { - AbnormalStatusUpdate asu = null; - PartySpelled ps = null; - PartySpelled psSummon = null; - ExOlympiadSpelledInfo os = null; - boolean isSummon = false; - - if (_owner.isPlayer()) + _updateEffectIconTask = ThreadPool.schedule(() -> { - if (_partyOnly) - { - _partyOnly = false; - } - else - { - asu = new AbnormalStatusUpdate(); - } + AbnormalStatusUpdate asu = null; + PartySpelled ps = null; + PartySpelled psSummon = null; + ExOlympiadSpelledInfo os = null; + boolean isSummon = false; - if (_owner.isInParty()) + if (_owner.isPlayer()) { - ps = new PartySpelled(_owner); - } - - if (_owner.getActingPlayer().isInOlympiadMode() && _owner.getActingPlayer().isOlympiadStart()) - { - os = new ExOlympiadSpelledInfo(_owner.getActingPlayer()); - } - } - else if (_owner.isSummon()) - { - isSummon = true; - ps = new PartySpelled(_owner); - psSummon = new PartySpelled(_owner); - } - - // Buffs. - if (hasBuffs()) - { - for (BuffInfo info : _buffs) - { - if (info.getSkill().isHealingPotionSkill()) + if (_partyOnly) { - shortBuffStatusUpdate(info); + _partyOnly = false; } else + { + asu = new AbnormalStatusUpdate(); + } + + if (_owner.isInParty()) + { + ps = new PartySpelled(_owner); + } + + if (_owner.getActingPlayer().isInOlympiadMode() && _owner.getActingPlayer().isOlympiadStart()) + { + os = new ExOlympiadSpelledInfo(_owner.getActingPlayer()); + } + } + else if (_owner.isSummon()) + { + isSummon = true; + ps = new PartySpelled(_owner); + psSummon = new PartySpelled(_owner); + } + + // Buffs. + if (hasBuffs()) + { + for (BuffInfo info : _buffs) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + addIcon(info, asu, ps, psSummon, os, isSummon); + } + } + } + + // Songs and dances. + if (hasDances()) + { + for (BuffInfo info : _dances) { addIcon(info, asu, ps, psSummon, os, isSummon); } } - } - - // Songs and dances. - if (hasDances()) - { - for (BuffInfo info : _dances) + + // Toggles. + if (hasToggles()) { - addIcon(info, asu, ps, psSummon, os, isSummon); - } - } - - // Toggles. - if (hasToggles()) - { - for (BuffInfo info : _toggles) - { - addIcon(info, asu, ps, psSummon, os, isSummon); - } - } - - // Debuffs. - if (hasDebuffs()) - { - for (BuffInfo info : _debuffs) - { - addIcon(info, asu, ps, psSummon, os, isSummon); - } - } - - if (asu != null) - { - _owner.sendPacket(asu); - } - - if (ps != null) - { - if (_owner.isSummon()) - { - final Player summonOwner = ((Summon) _owner).getOwner(); - if (summonOwner != null) + for (BuffInfo info : _toggles) { - if (summonOwner.isInParty()) + addIcon(info, asu, ps, psSummon, os, isSummon); + } + } + + // Debuffs. + if (hasDebuffs()) + { + for (BuffInfo info : _debuffs) + { + addIcon(info, asu, ps, psSummon, os, isSummon); + } + } + + if (asu != null) + { + _owner.sendPacket(asu); + } + + if (ps != null) + { + if (_owner.isSummon()) + { + final Player summonOwner = ((Summon) _owner).getOwner(); + if (summonOwner != null) { - summonOwner.getParty().broadcastToPartyMembers(summonOwner, psSummon); // send to all member except summonOwner - summonOwner.sendPacket(ps); // now send to summonOwner + if (summonOwner.isInParty()) + { + summonOwner.getParty().broadcastToPartyMembers(summonOwner, psSummon); // send to all member except summonOwner + summonOwner.sendPacket(ps); // now send to summonOwner + } + else + { + summonOwner.sendPacket(ps); + } } - else + } + else if (_owner.isPlayer() && _owner.isInParty()) + { + _owner.getParty().broadcastPacket(ps); + } + } + + if (os != null) + { + final List specs = Olympiad.getInstance().getSpectators(((Player) _owner).getOlympiadGameId()); + if ((specs != null) && !specs.isEmpty()) + { + for (Player spec : specs) { - summonOwner.sendPacket(ps); + if (spec != null) + { + spec.sendPacket(os); + } } } } - else if (_owner.isPlayer() && _owner.isInParty()) - { - _owner.getParty().broadcastPacket(ps); - } - } - - if (os != null) - { - final List specs = Olympiad.getInstance().getSpectators(((Player) _owner).getOlympiadGameId()); - if ((specs != null) && !specs.isEmpty()) - { - for (Player spec : specs) - { - if (spec != null) - { - spec.sendPacket(os); - } - } - } - } - - _effectIconsUpdate = null; - }, 500); + + _updateEffectIconTask = null; + }, 300); + } } private void addIcon(BuffInfo info, AbnormalStatusUpdate asu, PartySpelled ps, PartySpelled psSummon, ExOlympiadSpelledInfo os, boolean isSummon) diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java index eb812293f6..c69d2edb74 100644 --- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -389,6 +389,8 @@ public class Player extends Playable private long _lastAccess; private long _uptime; + private ScheduledFuture _skillListTask; + private boolean _subclassLock = false; protected int _baseClass; protected int _activeClass; @@ -9574,34 +9576,41 @@ public class Player extends Playable public void sendSkillList() { - boolean isDisabled = false; - final SkillList sl = new SkillList(); - for (Skill s : getAllSkills()) + if (_skillListTask == null) { - if (s == null) + _skillListTask = ThreadPool.schedule(() -> { - continue; - } - - if (_clan != null) - { - isDisabled = s.isClanSkill() && (_clan.getReputationScore() < 0); - } - - boolean isEnchantable = SkillData.getInstance().isEnchantable(s.getId()); - if (isEnchantable) - { - final EnchantSkillLearn esl = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(s.getId()); - if ((esl == null) || (s.getLevel() < esl.getBaseLevel())) + boolean isDisabled = false; + final SkillList skillList = new SkillList(); + for (Skill skill : getAllSkills()) { - isEnchantable = false; + if (skill == null) + { + continue; + } + + if (_clan != null) + { + isDisabled = skill.isClanSkill() && (_clan.getReputationScore() < 0); + } + + boolean isEnchantable = SkillData.getInstance().isEnchantable(skill.getId()); + if (isEnchantable) + { + final EnchantSkillLearn esl = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(skill.getId()); + if ((esl == null) || (skill.getLevel() < esl.getBaseLevel())) + { + isEnchantable = false; + } + } + + skillList.addSkill(skill.getDisplayId(), skill.getDisplayLevel(), skill.isPassive(), isDisabled, isEnchantable); } - } - - sl.addSkill(s.getDisplayId(), s.getDisplayLevel(), s.isPassive(), isDisabled, isEnchantable); + + sendPacket(skillList); + _skillListTask = null; + }, 300); } - - sendPacket(sl); } /** diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/Summon.java index 642061c841..675204176d 100644 --- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -74,6 +78,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _shotsMask = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -190,7 +197,17 @@ public abstract class Summon extends Playable @Override public void updateAbnormalEffect() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> player.sendPacket(new SummonInfo(this, player, 1))); + if (_abnormalEffectTask == null) + { + _abnormalEffectTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> player.sendPacket(new SummonInfo(this, player, 1))); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -823,18 +840,28 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + // final Party party = _owner.getParty(); + // if (party != null) + // { + // party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + // } + + updateEffectIcons(true); + } + _statusUpdateTask = null; + }, 50); } - // final Party party = _owner.getParty(); - // if (party != null) - // { - // party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); - // } - updateEffectIcons(true); } public void broadcastNpcInfo(int value) diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/EffectList.java index 0fa026f393..8fbebb5a3a 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/EffectList.java @@ -91,8 +91,8 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); - - private ScheduledFuture _effectIconsUpdate; + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; /** * Constructor for effect list. @@ -1377,137 +1377,134 @@ public class EffectList return; } - // Check if the previous call hasnt finished, if so, don't send packets uselessly again. - if ((_effectIconsUpdate != null) && !_effectIconsUpdate.isDone()) + if (_updateEffectIconTask == null) { - return; - } - // Schedule the icon update packets 500miliseconds ahead, so it can gather-up most of the changes. - _effectIconsUpdate = ThreadPool.schedule(() -> - { - AbnormalStatusUpdate asu = null; - PartySpelled ps = null; - PartySpelled psSummon = null; - ExOlympiadSpelledInfo os = null; - boolean isSummon = false; - - if (_owner.isPlayer()) + _updateEffectIconTask = ThreadPool.schedule(() -> { - if (_partyOnly) - { - _partyOnly = false; - } - else - { - asu = new AbnormalStatusUpdate(); - } + AbnormalStatusUpdate asu = null; + PartySpelled ps = null; + PartySpelled psSummon = null; + ExOlympiadSpelledInfo os = null; + boolean isSummon = false; - if (_owner.isInParty()) + if (_owner.isPlayer()) { - ps = new PartySpelled(_owner); - } - - if (_owner.getActingPlayer().isInOlympiadMode() && _owner.getActingPlayer().isOlympiadStart()) - { - os = new ExOlympiadSpelledInfo(_owner.getActingPlayer()); - } - } - else if (_owner.isSummon()) - { - isSummon = true; - ps = new PartySpelled(_owner); - psSummon = new PartySpelled(_owner); - } - - // Buffs. - if (hasBuffs()) - { - for (BuffInfo info : _buffs) - { - if (info.getSkill().isHealingPotionSkill()) + if (_partyOnly) { - shortBuffStatusUpdate(info); + _partyOnly = false; } else + { + asu = new AbnormalStatusUpdate(); + } + + if (_owner.isInParty()) + { + ps = new PartySpelled(_owner); + } + + if (_owner.getActingPlayer().isInOlympiadMode() && _owner.getActingPlayer().isOlympiadStart()) + { + os = new ExOlympiadSpelledInfo(_owner.getActingPlayer()); + } + } + else if (_owner.isSummon()) + { + isSummon = true; + ps = new PartySpelled(_owner); + psSummon = new PartySpelled(_owner); + } + + // Buffs. + if (hasBuffs()) + { + for (BuffInfo info : _buffs) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + addIcon(info, asu, ps, psSummon, os, isSummon); + } + } + } + + // Songs and dances. + if (hasDances()) + { + for (BuffInfo info : _dances) { addIcon(info, asu, ps, psSummon, os, isSummon); } } - } - - // Songs and dances. - if (hasDances()) - { - for (BuffInfo info : _dances) + + // Toggles. + if (hasToggles()) { - addIcon(info, asu, ps, psSummon, os, isSummon); - } - } - - // Toggles. - if (hasToggles()) - { - for (BuffInfo info : _toggles) - { - addIcon(info, asu, ps, psSummon, os, isSummon); - } - } - - // Debuffs. - if (hasDebuffs()) - { - for (BuffInfo info : _debuffs) - { - addIcon(info, asu, ps, psSummon, os, isSummon); - } - } - - if (asu != null) - { - _owner.sendPacket(asu); - } - - if (ps != null) - { - if (_owner.isSummon()) - { - final Player summonOwner = ((Summon) _owner).getOwner(); - if (summonOwner != null) + for (BuffInfo info : _toggles) { - if (summonOwner.isInParty()) + addIcon(info, asu, ps, psSummon, os, isSummon); + } + } + + // Debuffs. + if (hasDebuffs()) + { + for (BuffInfo info : _debuffs) + { + addIcon(info, asu, ps, psSummon, os, isSummon); + } + } + + if (asu != null) + { + _owner.sendPacket(asu); + } + + if (ps != null) + { + if (_owner.isSummon()) + { + final Player summonOwner = ((Summon) _owner).getOwner(); + if (summonOwner != null) { - summonOwner.getParty().broadcastToPartyMembers(summonOwner, psSummon); // send to all member except summonOwner - summonOwner.sendPacket(ps); // now send to summonOwner + if (summonOwner.isInParty()) + { + summonOwner.getParty().broadcastToPartyMembers(summonOwner, psSummon); // send to all member except summonOwner + summonOwner.sendPacket(ps); // now send to summonOwner + } + else + { + summonOwner.sendPacket(ps); + } } - else + } + else if (_owner.isPlayer() && _owner.isInParty()) + { + _owner.getParty().broadcastPacket(ps); + } + } + + if (os != null) + { + final List specs = Olympiad.getInstance().getSpectators(((Player) _owner).getOlympiadGameId()); + if ((specs != null) && !specs.isEmpty()) + { + for (Player spec : specs) { - summonOwner.sendPacket(ps); + if (spec != null) + { + spec.sendPacket(os); + } } } } - else if (_owner.isPlayer() && _owner.isInParty()) - { - _owner.getParty().broadcastPacket(ps); - } - } - - if (os != null) - { - final List specs = Olympiad.getInstance().getSpectators(((Player) _owner).getOlympiadGameId()); - if ((specs != null) && !specs.isEmpty()) - { - for (Player spec : specs) - { - if (spec != null) - { - spec.sendPacket(os); - } - } - } - } - - _effectIconsUpdate = null; - }, 500); + + _updateEffectIconTask = null; + }, 300); + } } private void addIcon(BuffInfo info, AbnormalStatusUpdate asu, PartySpelled ps, PartySpelled psSummon, ExOlympiadSpelledInfo os, boolean isSummon) diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java index 58b221abd0..8f018947c7 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -423,6 +423,8 @@ public class Player extends Playable private long _lastAccess; private long _uptime; + private ScheduledFuture _skillListTask; + private boolean _subclassLock = false; protected int _baseClass; protected int _activeClass; @@ -10049,77 +10051,84 @@ public class Player extends Playable public void sendSkillList() { - boolean isDisabled = false; - final SkillList sl = new SkillList(); - for (Skill s : getAllSkills()) + if (_skillListTask == null) { - if ((s == null) || ((_transformation != null) && !s.isPassive()) || (hasTransformSkill(s.getId()) && s.isPassive())) + _skillListTask = ThreadPool.schedule(() -> { - continue; - } - if (_clan != null) - { - isDisabled = s.isClanSkill() && (_clan.getReputationScore() < 0); - } - - boolean isEnchantable = SkillData.getInstance().isEnchantable(s.getId()); - if (isEnchantable) - { - final EnchantSkillLearn esl = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(s.getId()); - if ((esl == null) || (s.getLevel() < esl.getBaseLevel())) + boolean isDisabled = false; + final SkillList skillList = new SkillList(); + for (Skill skill : getAllSkills()) { - isEnchantable = false; - } - } - - sl.addSkill(s.getDisplayId(), s.getDisplayLevel(), s.isPassive(), isDisabled, isEnchantable); - } - - if (_transformation != null) - { - final Map ts = new TreeMap<>(); - for (SkillHolder holder : _transformation.getTemplate(this).getSkills()) - { - ts.putIfAbsent(holder.getSkillId(), holder.getSkillLevel()); - if (ts.get(holder.getSkillId()) < holder.getSkillLevel()) - { - ts.put(holder.getSkillId(), holder.getSkillLevel()); - } - } - - for (AdditionalSkillHolder holder : _transformation.getTemplate(this).getAdditionalSkills()) - { - if (getLevel() >= holder.getMinLevel()) - { - ts.putIfAbsent(holder.getSkillId(), holder.getSkillLevel()); - if (ts.get(holder.getSkillId()) < holder.getSkillLevel()) + if ((skill == null) || ((_transformation != null) && !skill.isPassive()) || (hasTransformSkill(skill.getId()) && skill.isPassive())) { - ts.put(holder.getSkillId(), holder.getSkillLevel()); + continue; + } + if (_clan != null) + { + isDisabled = skill.isClanSkill() && (_clan.getReputationScore() < 0); + } + + boolean isEnchantable = SkillData.getInstance().isEnchantable(skill.getId()); + if (isEnchantable) + { + final EnchantSkillLearn esl = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(skill.getId()); + if ((esl == null) || (skill.getLevel() < esl.getBaseLevel())) + { + isEnchantable = false; + } + } + + skillList.addSkill(skill.getDisplayId(), skill.getDisplayLevel(), skill.isPassive(), isDisabled, isEnchantable); + } + + if (_transformation != null) + { + final Map ts = new TreeMap<>(); + for (SkillHolder holder : _transformation.getTemplate(this).getSkills()) + { + ts.putIfAbsent(holder.getSkillId(), holder.getSkillLevel()); + if (ts.get(holder.getSkillId()) < holder.getSkillLevel()) + { + ts.put(holder.getSkillId(), holder.getSkillLevel()); + } + } + + for (AdditionalSkillHolder holder : _transformation.getTemplate(this).getAdditionalSkills()) + { + if (getLevel() >= holder.getMinLevel()) + { + ts.putIfAbsent(holder.getSkillId(), holder.getSkillLevel()); + if (ts.get(holder.getSkillId()) < holder.getSkillLevel()) + { + ts.put(holder.getSkillId(), holder.getSkillLevel()); + } + } + } + + // Add collection skills. + if (_transformation.isFlying()) + { + for (SkillLearn skill : SkillTreeData.getInstance().getCollectSkillTree().values()) + { + if ((getKnownSkill(skill.getSkillId()) != null) && (!ts.containsKey(skill.getSkillId()) || (ts.get(skill.getSkillId()) < skill.getSkillLevel()))) + { + ts.put(skill.getSkillId(), skill.getSkillLevel()); + } + } + } + + for (Entry transformSkill : ts.entrySet()) + { + final Skill sk = SkillData.getInstance().getSkill(transformSkill.getKey(), transformSkill.getValue()); + addTransformSkill(sk); + skillList.addSkill(transformSkill.getKey(), transformSkill.getValue(), false, false, false); } } - } - - // Add collection skills. - if (_transformation.isFlying()) - { - for (SkillLearn skill : SkillTreeData.getInstance().getCollectSkillTree().values()) - { - if ((getKnownSkill(skill.getSkillId()) != null) && (!ts.containsKey(skill.getSkillId()) || (ts.get(skill.getSkillId()) < skill.getSkillLevel()))) - { - ts.put(skill.getSkillId(), skill.getSkillLevel()); - } - } - } - - for (Entry transformSkill : ts.entrySet()) - { - final Skill sk = SkillData.getInstance().getSkill(transformSkill.getKey(), transformSkill.getValue()); - addTransformSkill(sk); - sl.addSkill(transformSkill.getKey(), transformSkill.getValue(), false, false, false); - } + + sendPacket(skillList); + _skillListTask = null; + }, 300); } - - sendPacket(sl); } /** diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Summon.java index 3546f60a58..2567e80c4f 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -78,6 +82,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _shotsMask = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -194,7 +201,17 @@ public abstract class Summon extends Playable @Override public void updateAbnormalEffect() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> player.sendPacket(new SummonInfo(this, player, 1))); + if (_abnormalEffectTask == null) + { + _abnormalEffectTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> player.sendPacket(new SummonInfo(this, player, 1))); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -837,18 +854,28 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + + updateEffectIcons(true); + } + _statusUpdateTask = null; + }, 50); } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); - } - updateEffectIcons(true); } public void broadcastNpcInfo(int value) diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/EffectList.java index 3d1be23aa6..7b935ea661 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/EffectList.java @@ -94,8 +94,8 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); - - private ScheduledFuture _effectIconsUpdate; + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; /** * Constructor for effect list. @@ -1529,140 +1529,137 @@ public class EffectList return; } - // Check if the previous call hasnt finished, if so, don't send packets uselessly again. - if ((_effectIconsUpdate != null) && !_effectIconsUpdate.isDone()) + if (_updateEffectIconTask == null) { - return; - } - // Schedule the icon update packets 500miliseconds ahead, so it can gather-up most of the changes. - _effectIconsUpdate = ThreadPool.schedule(() -> - { - AbnormalStatusUpdate asu = null; - PartySpelled ps = null; - PartySpelled psSummon = null; - ExOlympiadSpelledInfo os = null; - boolean isSummon = false; - - if (_owner.isPlayer()) + _updateEffectIconTask = ThreadPool.schedule(() -> { - if (_partyOnly) - { - _partyOnly = false; - } - else - { - asu = new AbnormalStatusUpdate(); - } + AbnormalStatusUpdate asu = null; + PartySpelled ps = null; + PartySpelled psSummon = null; + ExOlympiadSpelledInfo os = null; + boolean isSummon = false; - if (_owner.isInParty()) + if (_owner.isPlayer()) { - ps = new PartySpelled(_owner); - } - - if (_owner.getActingPlayer().isInOlympiadMode() && _owner.getActingPlayer().isOlympiadStart()) - { - os = new ExOlympiadSpelledInfo(_owner.getActingPlayer()); - } - } - else if (_owner.isSummon()) - { - isSummon = true; - ps = new PartySpelled(_owner); - psSummon = new PartySpelled(_owner); - } - - // Buffs. - if (hasBuffs()) - { - for (BuffInfo info : _buffs) - { - if (info.getSkill().isHealingPotionSkill()) + if (_partyOnly) { - shortBuffStatusUpdate(info); + _partyOnly = false; } else + { + asu = new AbnormalStatusUpdate(); + } + + if (_owner.isInParty()) + { + ps = new PartySpelled(_owner); + } + + if (_owner.getActingPlayer().isInOlympiadMode() && _owner.getActingPlayer().isOlympiadStart()) + { + os = new ExOlympiadSpelledInfo(_owner.getActingPlayer()); + } + } + else if (_owner.isSummon()) + { + isSummon = true; + ps = new PartySpelled(_owner); + psSummon = new PartySpelled(_owner); + } + + // Buffs. + if (hasBuffs()) + { + for (BuffInfo info : _buffs) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + addIcon(info, asu, ps, psSummon, os, isSummon); + } + } + } + + // Triggered buffs. + if (hasTriggered()) + { + for (BuffInfo info : _triggered) { addIcon(info, asu, ps, psSummon, os, isSummon); } } - } - - // Triggered buffs. - if (hasTriggered()) - { - for (BuffInfo info : _triggered) + + // Songs and dances. + if (hasDances()) { - addIcon(info, asu, ps, psSummon, os, isSummon); - } - } - - // Songs and dances. - if (hasDances()) - { - for (BuffInfo info : _dances) - { - addIcon(info, asu, ps, psSummon, os, isSummon); - } - } - - // Toggles. - if (hasToggles()) - { - for (BuffInfo info : _toggles) - { - addIcon(info, asu, ps, psSummon, os, isSummon); - } - } - - // Debuffs. - if (hasDebuffs()) - { - for (BuffInfo info : _debuffs) - { - addIcon(info, asu, ps, psSummon, os, isSummon); - } - } - - if (asu != null) - { - _owner.sendPacket(asu); - } - - if (ps != null) - { - if (_owner.isSummon()) - { - final Player summonOwner = ((Summon) _owner).getOwner(); - if (summonOwner != null) + for (BuffInfo info : _dances) { - if (summonOwner.isInParty()) - { - summonOwner.getParty().broadcastToPartyMembers(summonOwner, psSummon); // send to all member except summonOwner - summonOwner.sendPacket(ps); // now send to summonOwner - } - else - { - summonOwner.sendPacket(ps); - } + addIcon(info, asu, ps, psSummon, os, isSummon); } } - else if (_owner.isPlayer() && _owner.isInParty()) + + // Toggles. + if (hasToggles()) { - _owner.getParty().broadcastPacket(ps); + for (BuffInfo info : _toggles) + { + addIcon(info, asu, ps, psSummon, os, isSummon); + } } - } - - if (os != null) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(_owner.getActingPlayer().getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Debuffs. + if (hasDebuffs()) { - game.getZone().broadcastPacketToObservers(os); + for (BuffInfo info : _debuffs) + { + addIcon(info, asu, ps, psSummon, os, isSummon); + } } - } - - _effectIconsUpdate = null; - }, 500); + + if (asu != null) + { + _owner.sendPacket(asu); + } + + if (ps != null) + { + if (_owner.isSummon()) + { + final Player summonOwner = ((Summon) _owner).getOwner(); + if (summonOwner != null) + { + if (summonOwner.isInParty()) + { + summonOwner.getParty().broadcastToPartyMembers(summonOwner, psSummon); // send to all member except summonOwner + summonOwner.sendPacket(ps); // now send to summonOwner + } + else + { + summonOwner.sendPacket(ps); + } + } + } + else if (_owner.isPlayer() && _owner.isInParty()) + { + _owner.getParty().broadcastPacket(ps); + } + } + + if (os != null) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(_owner.getActingPlayer().getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) + { + game.getZone().broadcastPacketToObservers(os); + } + } + + _updateEffectIconTask = null; + }, 300); + } } private void addIcon(BuffInfo info, AbnormalStatusUpdate asu, PartySpelled ps, PartySpelled psSummon, ExOlympiadSpelledInfo os, boolean isSummon) diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java index 493cfda35f..11a08ff75a 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -442,6 +442,8 @@ public class Player extends Playable private long _lastAccess; private long _uptime; + private ScheduledFuture _skillListTask; + private boolean _subclassLock = false; protected int _baseClass; protected int _activeClass; @@ -9932,77 +9934,84 @@ public class Player extends Playable public void sendSkillList() { - boolean isDisabled = false; - final SkillList sl = new SkillList(); - for (Skill s : getAllSkills()) + if (_skillListTask == null) { - if ((s == null) || ((_transformation != null) && !s.isPassive()) || (hasTransformSkill(s.getId()) && s.isPassive())) + _skillListTask = ThreadPool.schedule(() -> { - continue; - } - if (_clan != null) - { - isDisabled = s.isClanSkill() && (_clan.getReputationScore() < 0); - } - - boolean isEnchantable = SkillData.getInstance().isEnchantable(s.getId()); - if (isEnchantable) - { - final EnchantSkillLearn esl = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(s.getId()); - if ((esl == null) || (s.getLevel() < esl.getBaseLevel())) + boolean isDisabled = false; + final SkillList skillList = new SkillList(); + for (Skill skill : getAllSkills()) { - isEnchantable = false; - } - } - - sl.addSkill(s.getDisplayId(), s.getDisplayLevel(), s.isPassive(), isDisabled, isEnchantable); - } - - if (_transformation != null) - { - final Map ts = new TreeMap<>(); - for (SkillHolder holder : _transformation.getTemplate(this).getSkills()) - { - ts.putIfAbsent(holder.getSkillId(), holder.getSkillLevel()); - if (ts.get(holder.getSkillId()) < holder.getSkillLevel()) - { - ts.put(holder.getSkillId(), holder.getSkillLevel()); - } - } - - for (AdditionalSkillHolder holder : _transformation.getTemplate(this).getAdditionalSkills()) - { - if (getLevel() >= holder.getMinLevel()) - { - ts.putIfAbsent(holder.getSkillId(), holder.getSkillLevel()); - if (ts.get(holder.getSkillId()) < holder.getSkillLevel()) + if ((skill == null) || ((_transformation != null) && !skill.isPassive()) || (hasTransformSkill(skill.getId()) && skill.isPassive())) { - ts.put(holder.getSkillId(), holder.getSkillLevel()); + continue; + } + if (_clan != null) + { + isDisabled = skill.isClanSkill() && (_clan.getReputationScore() < 0); + } + + boolean isEnchantable = SkillData.getInstance().isEnchantable(skill.getId()); + if (isEnchantable) + { + final EnchantSkillLearn esl = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(skill.getId()); + if ((esl == null) || (skill.getLevel() < esl.getBaseLevel())) + { + isEnchantable = false; + } + } + + skillList.addSkill(skill.getDisplayId(), skill.getDisplayLevel(), skill.isPassive(), isDisabled, isEnchantable); + } + + if (_transformation != null) + { + final Map ts = new TreeMap<>(); + for (SkillHolder holder : _transformation.getTemplate(this).getSkills()) + { + ts.putIfAbsent(holder.getSkillId(), holder.getSkillLevel()); + if (ts.get(holder.getSkillId()) < holder.getSkillLevel()) + { + ts.put(holder.getSkillId(), holder.getSkillLevel()); + } + } + + for (AdditionalSkillHolder holder : _transformation.getTemplate(this).getAdditionalSkills()) + { + if (getLevel() >= holder.getMinLevel()) + { + ts.putIfAbsent(holder.getSkillId(), holder.getSkillLevel()); + if (ts.get(holder.getSkillId()) < holder.getSkillLevel()) + { + ts.put(holder.getSkillId(), holder.getSkillLevel()); + } + } + } + + // Add collection skills. + if (_transformation.isFlying()) + { + for (SkillLearn skill : SkillTreeData.getInstance().getCollectSkillTree().values()) + { + if ((getKnownSkill(skill.getSkillId()) != null) && (!ts.containsKey(skill.getSkillId()) || (ts.get(skill.getSkillId()) < skill.getSkillLevel()))) + { + ts.put(skill.getSkillId(), skill.getSkillLevel()); + } + } + } + + for (Entry transformSkill : ts.entrySet()) + { + final Skill sk = SkillData.getInstance().getSkill(transformSkill.getKey(), transformSkill.getValue()); + addTransformSkill(sk); + skillList.addSkill(transformSkill.getKey(), transformSkill.getValue(), false, false, false); } } - } - - // Add collection skills. - if (_transformation.isFlying()) - { - for (SkillLearn skill : SkillTreeData.getInstance().getCollectSkillTree().values()) - { - if ((getKnownSkill(skill.getSkillId()) != null) && (!ts.containsKey(skill.getSkillId()) || (ts.get(skill.getSkillId()) < skill.getSkillLevel()))) - { - ts.put(skill.getSkillId(), skill.getSkillLevel()); - } - } - } - - for (Entry transformSkill : ts.entrySet()) - { - final Skill sk = SkillData.getInstance().getSkill(transformSkill.getKey(), transformSkill.getValue()); - addTransformSkill(sk); - sl.addSkill(transformSkill.getKey(), transformSkill.getValue(), false, false, false); - } + + sendPacket(skillList); + _skillListTask = null; + }, 300); } - - sendPacket(sl); } /** diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Summon.java index 5bb99abef9..830395152b 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -78,6 +82,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _shotsMask = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -194,7 +201,17 @@ public abstract class Summon extends Playable @Override public void updateAbnormalEffect() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> player.sendPacket(new SummonInfo(this, player, 1))); + if (_abnormalEffectTask == null) + { + _abnormalEffectTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> player.sendPacket(new SummonInfo(this, player, 1))); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -837,18 +854,28 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + + updateEffectIcons(true); + } + _statusUpdateTask = null; + }, 50); } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); - } - updateEffectIcons(true); } public void broadcastNpcInfo(int value) diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index 3c63c364d3..99c16a50e6 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -91,7 +90,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java index 0cbcde11f1..9a33716f0b 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -442,6 +442,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2272,7 +2274,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8659,8 +8661,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + broadcastCharInfo(); + _abnormalVisualEffectTask = null; + }, 50); + } } /** @@ -9481,6 +9490,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 three) for this character.
* 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. @@ -9922,7 +9943,7 @@ public class Player extends Playable sendPacket(new ShortCutInit(this)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Summon.java index f97d0dc5eb..1a44279987 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index ac538aef99..5a9955667a 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -86,7 +86,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExPledgeWaitingListAlarm; import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -448,7 +447,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index c9c7fd0b17..8a6c6c0c16 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; @@ -696,7 +695,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket // If skill is expand type then sends packet: if ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index 3c63c364d3..99c16a50e6 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -91,7 +90,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); diff --git a/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java index e89d2ac5de..012c7d9198 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -442,6 +442,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2272,7 +2274,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8659,8 +8661,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + broadcastCharInfo(); + _abnormalVisualEffectTask = null; + }, 50); + } } /** @@ -9481,6 +9490,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 three) for this character.
* 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. @@ -9922,7 +9943,7 @@ public class Player extends Playable sendPacket(new ShortCutInit(this)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/actor/Summon.java index f97d0dc5eb..1a44279987 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 20cfecaf02..d96cfba7eb 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -86,7 +86,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExPledgeWaitingListAlarm; import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -448,7 +447,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index c9c7fd0b17..8a6c6c0c16 100644 --- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; @@ -696,7 +695,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket // If skill is expand type then sends packet: if ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index 3c63c364d3..99c16a50e6 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -91,7 +90,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); diff --git a/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java index e5803217ed..b6883add1f 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -440,6 +440,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2270,7 +2272,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8645,8 +8647,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + broadcastCharInfo(); + _abnormalVisualEffectTask = null; + }, 50); + } } /** @@ -9467,6 +9476,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 three) for this character.
* 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. @@ -9908,7 +9929,7 @@ public class Player extends Playable sendPacket(new ShortCutInit(this)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/actor/Summon.java index f97d0dc5eb..1a44279987 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index e23924126e..8c93d6ac27 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -87,7 +87,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExPledgeWaitingListAlarm; import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -451,7 +450,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 2d352bae1a..5b63b934a4 100644 --- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; @@ -696,7 +695,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket // If skill is expand type then sends packet: if ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index 3c63c364d3..99c16a50e6 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -91,7 +90,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java index bc1c86fd91..f38750931b 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -449,6 +449,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2296,7 +2298,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8685,8 +8687,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + broadcastCharInfo(); + _abnormalVisualEffectTask = null; + }, 50); + } } /** @@ -9507,6 +9516,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 three) for this character.
* 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. @@ -9948,7 +9969,7 @@ public class Player extends Playable sendPacket(new ShortCutInit(this)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Summon.java index 298c55d86d..7a0528028e 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 80ce08825b..00d1334fe9 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -87,7 +87,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExPledgeWaitingListAlarm; import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -451,7 +450,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 0f2f90a572..8c3aecd086 100644 --- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; @@ -696,7 +695,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket // If skill is expand type then sends packet: if ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index 3c63c364d3..99c16a50e6 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -91,7 +90,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java index d7a2108741..5ccc0d49ad 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -449,6 +449,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2296,7 +2298,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8685,8 +8687,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + broadcastCharInfo(); + _abnormalVisualEffectTask = null; + }, 50); + } } /** @@ -9507,6 +9516,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 three) for this character.
* 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. @@ -9948,7 +9969,7 @@ public class Player extends Playable sendPacket(new ShortCutInit(this)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Summon.java index 298c55d86d..7a0528028e 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 80ce08825b..00d1334fe9 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -87,7 +87,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExPledgeWaitingListAlarm; import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -451,7 +450,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 0f2f90a572..8c3aecd086 100644 --- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; @@ -696,7 +695,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket // If skill is expand type then sends packet: if ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index 5c5712fb34..5a595511ee 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -93,7 +92,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java index ba612eae62..d58ec615b3 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -462,6 +462,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2221,7 +2223,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8644,8 +8646,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + broadcastCharInfo(); + _abnormalVisualEffectTask = null; + }, 50); + } } /** @@ -9466,6 +9475,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 three) for this character.
* 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. @@ -9909,7 +9930,7 @@ public class Player extends Playable sendPacket(new ShortCutInit(this)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Summon.java index 08dcfef04f..d5db1162a0 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -834,16 +851,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index f1127fe62b..d78cc351f2 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -88,7 +88,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExPledgeWaitingListAlarm; import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -456,7 +455,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 370f9431ce..fe10969e76 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; @@ -615,7 +614,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket // If skill is expand type then sends packet: if ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index 3c63c364d3..99c16a50e6 100644 --- a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -28,7 +28,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -91,7 +90,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java index 05a55bae60..f064f2214f 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -437,6 +437,8 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2269,7 +2271,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8637,8 +8639,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + broadcastCharInfo(); + _abnormalVisualEffectTask = null; + }, 50); + } } /** @@ -9469,6 +9478,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 three) for this character.
* 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. @@ -9910,7 +9931,7 @@ public class Player extends Playable sendPacket(new ShortCutInit(this)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Summon.java index f97d0dc5eb..1a44279987 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -82,6 +86,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -193,26 +200,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -826,16 +843,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 9347aa0d61..e561f5b5a9 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -85,7 +85,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExPledgeWaitingListAlarm; import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -443,7 +442,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Friend list player.sendPacket(new L2FriendList(player)); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index c9c7fd0b17..8a6c6c0c16 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -51,7 +51,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; @@ -696,7 +695,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket // If skill is expand type then sends packet: if ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index 04ffadb655..1599c029d7 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -94,7 +93,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java index 6b8d6071b8..cab11b1adc 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java index a2cb18f6f4..1277b9b8c0 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -39,15 +37,13 @@ public class VitalityExpRate extends AbstractStatPercentEffect { effected.getStat().mergeMul(Stat.VITALITY_EXP_RATE, (_amount / 100) + 1); effected.getStat().mergeAdd(Stat.VITALITY_SKILLS, 1); - + final Player player = effected.getActingPlayer(); if (player == null) { return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/EffectList.java index 4ce831303f..1e06e53fdc 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java index 3bc6b1c0e4..a5fb1d723b 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -472,6 +472,9 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _userBoostStatTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2298,7 +2301,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8797,8 +8800,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + broadcastCharInfo(); + _abnormalVisualEffectTask = null; + }, 50); + } } /** @@ -9619,6 +9629,36 @@ 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)); + if (Config.ENABLE_VITALITY) + { + sendPacket(new ExVitalityEffectInfo(this)); + } + _userBoostStatTask = null; + }, 300); + } + } + /** * 1. Add the specified class ID as a subclass (up to the maximum number of three) for this character.
* 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 +10102,7 @@ public class Player extends Playable sendPacket(new ShortCutInit(this)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Summon.java index 9a0311e340..ebcfef6a88 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -86,6 +90,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -213,26 +220,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -862,16 +879,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 2c02cb3140..71c3975b01 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -90,7 +90,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExPledgeWaitingListAlarm; import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -460,7 +459,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Send Equipped Items player.sendPacket(new ExUserInfoEquipSlot(player)); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 680304ff09..03c74d08f0 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; @@ -651,7 +650,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket // If skill is expand type then sends packet: if ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java index c29127e752..84509fabce 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java @@ -19,7 +19,6 @@ package org.l2jmobius.gameserver.network.serverpackets; import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.xml.ExperienceData; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; @@ -420,13 +419,7 @@ public class UserInfo extends AbstractMaskPacket // Send exp bonus change. if (containsMask(UserInfoType.VITA_FAME)) { - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE)); - if (Config.ENABLE_VITALITY) - { - _player.sendPacket(new ExVitalityEffectInfo(_player)); - } + _player.sendUserBoostStat(); } return true; diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index 04ffadb655..1599c029d7 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -94,7 +93,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java index 6b8d6071b8..cab11b1adc 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java index a2cb18f6f4..1277b9b8c0 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -39,15 +37,13 @@ public class VitalityExpRate extends AbstractStatPercentEffect { effected.getStat().mergeMul(Stat.VITALITY_EXP_RATE, (_amount / 100) + 1); effected.getStat().mergeAdd(Stat.VITALITY_SKILLS, 1); - + final Player player = effected.getActingPlayer(); if (player == null) { return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/EffectList.java index bc08507351..4c89f9fa5d 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java index 14dd26856b..b4b4e7f166 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -491,6 +491,9 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _userBoostStatTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2323,7 +2326,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -8851,8 +8854,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + broadcastCharInfo(); + _abnormalVisualEffectTask = null; + }, 50); + } } /** @@ -9673,6 +9683,36 @@ 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)); + if (Config.ENABLE_VITALITY) + { + sendPacket(new ExVitalityEffectInfo(this)); + } + _userBoostStatTask = null; + }, 300); + } + } + /** * 1. Add the specified class ID as a subclass (up to the maximum number of three) for this character.
* 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. @@ -10117,7 +10157,7 @@ public class Player extends Playable sendPacket(new ShortCutInit(this)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Summon.java index 5b24c76217..bf78d8a55c 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -86,6 +90,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -213,26 +220,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -862,16 +879,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index ea5478af51..7c35f0790b 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -91,7 +91,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExPledgeWaitingListAlarm; import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -467,7 +466,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Send Equipped Items player.sendPacket(new ExUserInfoEquipSlot(player)); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 680304ff09..03c74d08f0 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; @@ -651,7 +650,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket // If skill is expand type then sends packet: if ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java index c29127e752..84509fabce 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java @@ -19,7 +19,6 @@ package org.l2jmobius.gameserver.network.serverpackets; import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.xml.ExperienceData; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; @@ -420,13 +419,7 @@ public class UserInfo extends AbstractMaskPacket // Send exp bonus change. if (containsMask(UserInfoType.VITA_FAME)) { - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE)); - if (Config.ENABLE_VITALITY) - { - _player.sendPacket(new ExVitalityEffectInfo(_player)); - } + _player.sendUserBoostStat(); } return true; diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index 04ffadb655..1599c029d7 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -94,7 +93,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java index 6b8d6071b8..cab11b1adc 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java index a2cb18f6f4..1277b9b8c0 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -39,15 +37,13 @@ public class VitalityExpRate extends AbstractStatPercentEffect { effected.getStat().mergeMul(Stat.VITALITY_EXP_RATE, (_amount / 100) + 1); effected.getStat().mergeAdd(Stat.VITALITY_SKILLS, 1); - + final Player player = effected.getActingPlayer(); if (player == null) { return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/EffectList.java index bc08507351..4c89f9fa5d 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java index 79298d1f7d..e7973e4c6f 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -495,6 +495,9 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _userBoostStatTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2338,7 +2341,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -9031,8 +9034,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + broadcastCharInfo(); + _abnormalVisualEffectTask = null; + }, 50); + } } /** @@ -9853,6 +9863,36 @@ 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)); + if (Config.ENABLE_VITALITY) + { + sendPacket(new ExVitalityEffectInfo(this)); + } + _userBoostStatTask = null; + }, 300); + } + } + /** * 1. Add the specified class ID as a subclass (up to the maximum number of three) for this character.
* 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. @@ -10293,7 +10333,7 @@ public class Player extends Playable sendPacket(new ShortCutInit(this)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Summon.java index 00e3feb41d..df47c6846f 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -86,6 +90,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -213,26 +220,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -862,16 +879,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 2f047088f2..7846787ee4 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -91,7 +91,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExPledgeWaitingListAlarm; import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -468,7 +467,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Send Equipped Items player.sendPacket(new ExUserInfoEquipSlot(player)); diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 6f0728cf52..3602619df0 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; @@ -651,7 +650,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket // If skill is expand type then sends packet: if ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java index 34381eb2d7..3cc87c88f0 100644 --- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java +++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java @@ -19,7 +19,6 @@ package org.l2jmobius.gameserver.network.serverpackets; import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.xml.ExperienceData; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; @@ -422,13 +421,7 @@ public class UserInfo extends AbstractMaskPacket // Send exp bonus change. if (containsMask(UserInfoType.VITA_FAME)) { - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE)); - if (Config.ENABLE_VITALITY) - { - _player.sendPacket(new ExVitalityEffectInfo(_player)); - } + _player.sendUserBoostStat(); } return true; diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java index 04ffadb655..1599c029d7 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/ClassChange.java @@ -29,7 +29,6 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.network.SystemMessageId; 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.PartySmallWindowAll; import org.l2jmobius.gameserver.network.serverpackets.PartySmallWindowDeleteAll; @@ -94,7 +93,7 @@ public class ClassChange extends AbstractEffect player.sendPacket(msg); player.broadcastUserInfo(); - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); player.sendPacket(new AcquireSkillList(player)); player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED)); diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java index c87705481d..019aece75e 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/EnlargeSlot.java @@ -19,11 +19,9 @@ package handlers.effecthandlers; import org.l2jmobius.gameserver.enums.StorageType; import org.l2jmobius.gameserver.model.StatSet; 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.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; /** * @author Sdw @@ -75,7 +73,7 @@ public class EnlargeSlot extends AbstractEffect effected.getStat().mergeAdd(stat, _amount); if (effected.isPlayer()) { - effected.sendPacket(new ExStorageMaxCount((Player) effected)); + effected.getActingPlayer().sendStorageMaxCount(); } } } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java index 6b8d6071b8..cab11b1adc 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/ExpModify.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -54,8 +52,6 @@ public class ExpModify extends AbstractStatAddEffect return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java index a2cb18f6f4..1277b9b8c0 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/effecthandlers/VitalityExpRate.java @@ -16,13 +16,11 @@ */ package handlers.effecthandlers; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.skill.Skill; import org.l2jmobius.gameserver.model.stats.Stat; -import org.l2jmobius.gameserver.network.serverpackets.ExUserBoostStat; /** * @author Mobius @@ -39,15 +37,13 @@ public class VitalityExpRate extends AbstractStatPercentEffect { effected.getStat().mergeMul(Stat.VITALITY_EXP_RATE, (_amount / 100) + 1); effected.getStat().mergeAdd(Stat.VITALITY_SKILLS, 1); - + final Player player = effected.getActingPlayer(); if (player == null) { return; } - player.sendPacket(new ExUserBoostStat(player, BonusExpType.VITALITY)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.BUFFS)); - player.sendPacket(new ExUserBoostStat(player, BonusExpType.PASSIVE)); + player.sendUserBoostStat(); } } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/EffectList.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/EffectList.java index bc08507351..4c89f9fa5d 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/EffectList.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/EffectList.java @@ -27,11 +27,14 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; 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.function.Predicate; import java.util.logging.Logger; import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.gameserver.enums.SkillFinishType; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; @@ -93,6 +96,9 @@ public class EffectList private final Creature _owner; /** Hidden buffs count, prevents iterations. */ private final AtomicInteger _hiddenBuffs = new AtomicInteger(); + /** Delay task **/ + private ScheduledFuture _updateEffectIconTask; + private final AtomicBoolean _updateAbnormalStatus = new AtomicBoolean(); /** * Constructor for effect list. @@ -1074,70 +1080,84 @@ public class EffectList */ public void updateEffectIcons(boolean partyOnly) { - final Player player = _owner.getActingPlayer(); - if (player != null) + if (!partyOnly) { - final Party party = player.getParty(); - final Optional asu = (_owner.isPlayer() && !partyOnly) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); - final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); - final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); - if (!_actives.isEmpty()) + _updateAbnormalStatus.compareAndSet(false, true); + } + + if (_updateEffectIconTask == null) + { + _updateEffectIconTask = ThreadPool.schedule(() -> { - for (BuffInfo info : _actives) + final Player player = _owner.getActingPlayer(); + if (player != null) { - if ((info != null) && info.isInUse()) + final Party party = player.getParty(); + final Optional asu = (_owner.isPlayer() && _updateAbnormalStatus.get()) ? Optional.of(new AbnormalStatusUpdate()) : Optional.empty(); + final Optional ps = ((party != null) || _owner.isSummon()) ? Optional.of(new PartySpelled(_owner)) : Optional.empty(); + final Optional os = (player.isInOlympiadMode() && player.isOlympiadStart()) ? Optional.of(new ExOlympiadSpelledInfo(player)) : Optional.empty(); + if (!_actives.isEmpty()) { - if (info.getSkill().isHealingPotionSkill()) + for (BuffInfo info : _actives) { - shortBuffStatusUpdate(info); + if ((info != null) && info.isInUse()) + { + if (info.getSkill().isHealingPotionSkill()) + { + shortBuffStatusUpdate(info); + } + else + { + asu.ifPresent(a -> a.addSkill(info)); + ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); + os.ifPresent(o -> o.addSkill(info)); + } + } } - else + } + + // Send icon update for player buff bar. + asu.ifPresent(_owner::sendPacket); + + // Player or summon is in party. Broadcast packet to everyone in the party. + if (party != null) + { + ps.ifPresent(party::broadcastPacket); + } + else // Not in party, then its a summon info for its owner. + { + ps.ifPresent(player::sendPacket); + } + + // Send icon update to all olympiad observers. + if (os.isPresent()) + { + final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); + if ((game != null) && game.isBattleStarted()) { - asu.ifPresent(a -> a.addSkill(info)); - ps.filter(p -> !info.getSkill().isToggle()).ifPresent(p -> p.addSkill(info)); - os.ifPresent(o -> o.addSkill(info)); + os.ifPresent(game.getStadium()::broadcastPacketToObservers); } } } - } - - // Send icon update for player buff bar. - asu.ifPresent(_owner::sendPacket); - - // Player or summon is in party. Broadcast packet to everyone in the party. - if (party != null) - { - ps.ifPresent(party::broadcastPacket); - } - else // Not in party, then its a summon info for its owner. - { - ps.ifPresent(player::sendPacket); - } - - // Send icon update to all olympiad observers. - if (os.isPresent()) - { - final OlympiadGameTask game = OlympiadGameManager.getInstance().getOlympiadTask(player.getOlympiadGameId()); - if ((game != null) && game.isBattleStarted()) + + // Update effect icons for everyone targeting this owner. + final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); + for (Creature creature : _owner.getStatus().getStatusListener()) { - os.ifPresent(game.getStadium()::broadcastPacketToObservers); + if ((creature != null) && creature.isPlayer()) + { + creature.sendPacket(upd); + } } - } - } - - // Update effect icons for everyone targeting this owner. - final ExAbnormalStatusUpdateFromTarget upd = new ExAbnormalStatusUpdateFromTarget(_owner); - for (Creature creature : _owner.getStatus().getStatusListener()) - { - if ((creature != null) && creature.isPlayer()) - { - creature.sendPacket(upd); - } - } - - if (_owner.isPlayer() && (_owner.getTarget() == _owner)) - { - _owner.sendPacket(upd); + + if (_owner.isPlayer() && (_owner.getTarget() == _owner)) + { + _owner.sendPacket(upd); + } + + _updateAbnormalStatus.set(false); + _updateEffectIconTask = null; + }, 300); } } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java index e9cc3d158c..21f077bb4c 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Player.java @@ -497,6 +497,9 @@ public class Player extends Playable private ScheduledFuture _itemListTask; private ScheduledFuture _skillListTask; + private ScheduledFuture _storageCountTask; + private ScheduledFuture _userBoostStatTask; + private ScheduledFuture _abnormalVisualEffectTask; private boolean _subclassLock = false; protected int _baseClass; @@ -2347,7 +2350,7 @@ public class Player extends Playable if (getInventoryLimit() != oldInvLimit) { - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); } } @@ -9085,8 +9088,15 @@ public class Player extends Playable @Override public void updateAbnormalVisualEffects() { - sendPacket(new ExUserInfoAbnormalVisualEffect(this)); - broadcastCharInfo(); + if (_abnormalVisualEffectTask == null) + { + _abnormalVisualEffectTask = ThreadPool.schedule(() -> + { + sendPacket(new ExUserInfoAbnormalVisualEffect(this)); + broadcastCharInfo(); + _abnormalVisualEffectTask = null; + }, 50); + } } /** @@ -9907,6 +9917,36 @@ 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)); + if (Config.ENABLE_VITALITY) + { + sendPacket(new ExVitalityEffectInfo(this)); + } + _userBoostStatTask = null; + }, 300); + } + } + /** * 1. Add the specified class ID as a subclass (up to the maximum number of three) for this character.
* 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. @@ -10347,7 +10387,7 @@ public class Player extends Playable sendPacket(new ShortCutInit(this)); broadcastPacket(new SocialAction(getObjectId(), SocialAction.LEVEL_UP)); sendPacket(new SkillCoolTime(this)); - sendPacket(new ExStorageMaxCount(this)); + sendStorageMaxCount(); EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this); } finally diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Summon.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Summon.java index 00e3feb41d..df47c6846f 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Summon.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/model/actor/Summon.java @@ -16,7 +16,11 @@ */ package org.l2jmobius.gameserver.model.actor; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.atomic.AtomicInteger; + import org.l2jmobius.Config; +import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.ai.CreatureAI; @@ -86,6 +90,9 @@ public abstract class Summon extends Playable private boolean _previousFollowStatus = true; protected boolean _restoreSummon = true; private int _summonPoints = 0; + private ScheduledFuture _abnormalEffectTask; + private ScheduledFuture _statusUpdateTask; + private final AtomicInteger _statusUpdateValue = new AtomicInteger(); // @formatter:off private static final int[] PASSIVE_SUMMONS = @@ -213,26 +220,36 @@ public abstract class Summon extends Playable @Override public void updateAbnormalVisualEffects() { - World.getInstance().forEachVisibleObject(this, Player.class, player -> + if (_abnormalEffectTask == null) { - if (player == _owner) + _abnormalEffectTask = ThreadPool.schedule(() -> { - player.sendPacket(new PetInfo(this, 1)); - return; - } - - final AbstractMaskPacket packet; - if (isPet()) - { - packet = new ExPetInfo(this, player, 1); - } - else - { - packet = new SummonInfo(this, player, 1); - } - packet.addComponentType(NpcInfoType.ABNORMALS); - player.sendPacket(packet); - }); + if (isSpawned()) + { + World.getInstance().forEachVisibleObject(this, Player.class, player -> + { + if (player == _owner) + { + player.sendPacket(new PetInfo(this, 1)); + return; + } + + final AbstractMaskPacket packet; + if (isPet()) + { + packet = new ExPetInfo(this, player, 1); + } + else + { + packet = new SummonInfo(this, player, 1); + } + packet.addComponentType(NpcInfoType.ABNORMALS); + player.sendPacket(packet); + }); + } + _abnormalEffectTask = null; + }, 50); + } } /** @@ -862,16 +879,25 @@ public abstract class Summon extends Playable return; } - sendPacket(new PetInfo(this, value)); - sendPacket(new PetStatusUpdate(this)); - if (isSpawned()) + _statusUpdateValue.set(value); + if (_statusUpdateTask == null) { - broadcastNpcInfo(value); - } - final Party party = _owner.getParty(); - if (party != null) - { - party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + _statusUpdateTask = ThreadPool.schedule(() -> + { + if (isSpawned()) + { + sendPacket(new PetInfo(this, _statusUpdateValue.get())); + sendPacket(new PetStatusUpdate(this)); + broadcastNpcInfo(_statusUpdateValue.get()); + + final Party party = _owner.getParty(); + if (party != null) + { + party.broadcastToPartyMembers(_owner, new ExPartyPetWindowUpdate(this)); + } + } + _statusUpdateTask = null; + }, 50); } } diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index c2dcefb9b5..71f15b58c7 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -91,7 +91,6 @@ import org.l2jmobius.gameserver.network.serverpackets.ExPledgeWaitingListAlarm; import org.l2jmobius.gameserver.network.serverpackets.ExQuestItemList; import org.l2jmobius.gameserver.network.serverpackets.ExRotation; import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage; -import org.l2jmobius.gameserver.network.serverpackets.ExStorageMaxCount; import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo; import org.l2jmobius.gameserver.network.serverpackets.ExUnReadMailCount; import org.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot; @@ -468,7 +467,7 @@ public class EnterWorld implements IClientIncomingPacket } // Expand Skill - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); // Send Equipped Items player.sendPacket(new ExUserInfoEquipSlot(player)); diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 6f0728cf52..3602619df0 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -49,7 +49,6 @@ import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillDone; import org.l2jmobius.gameserver.network.serverpackets.ExAcquirableSkillListByClass; import org.l2jmobius.gameserver.network.serverpackets.ExAlchemySkillList; 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.ShortCutInit; import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; @@ -651,7 +650,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket // If skill is expand type then sends packet: if ((_id >= 1368) && (_id <= 1372)) { - player.sendPacket(new ExStorageMaxCount(player)); + player.sendStorageMaxCount(); } // Notify scripts of the skill learn. diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java index f9bc8f0158..4be0e88c26 100644 --- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java +++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/serverpackets/UserInfo.java @@ -19,7 +19,6 @@ package org.l2jmobius.gameserver.network.serverpackets; import org.l2jmobius.Config; import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.gameserver.data.xml.ExperienceData; -import org.l2jmobius.gameserver.enums.BonusExpType; import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.instancemanager.CastleManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; @@ -427,13 +426,7 @@ public class UserInfo extends AbstractMaskPacket // Send exp bonus change. if (containsMask(UserInfoType.VITA_FAME)) { - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.VITALITY)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.BUFFS)); - _player.sendPacket(new ExUserBoostStat(_player, BonusExpType.PASSIVE)); - if (Config.ENABLE_VITALITY) - { - _player.sendPacket(new ExVitalityEffectInfo(_player)); - } + _player.sendUserBoostStat(); } return true;