Removed packet locks and relative improvements.

This commit is contained in:
MobiusDevelopment
2019-11-07 14:55:39 +00:00
parent 3f1cf5d1a7
commit b764d444df
128 changed files with 775 additions and 2146 deletions

View File

@ -29,11 +29,11 @@ import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.enums.AISkillScope;
import org.l2jmobius.gameserver.enums.AIType;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.RaidBossStatus;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.enums.MpRewardAffectType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.enums.Race;
import org.l2jmobius.gameserver.enums.RaidBossStatus;
import org.l2jmobius.gameserver.enums.ShotType;
import org.l2jmobius.gameserver.enums.TaxType;
import org.l2jmobius.gameserver.enums.Team;
@ -97,7 +97,6 @@ import org.l2jmobius.gameserver.network.serverpackets.NpcSay;
import org.l2jmobius.gameserver.network.serverpackets.ServerObjectInfo;
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
import org.l2jmobius.gameserver.taskmanager.DecayTaskManager;
import org.l2jmobius.gameserver.util.Broadcast;
@ -909,9 +908,7 @@ public class Npc extends Creature
{
player.setReputation(player.getReputation() - Formulas.calculateKarmaGain(player.getPkKills(), killer.isSummon()));
player.setPkKills(player.getPkKills() + 1);
final UserInfo ui = new UserInfo(player, false);
ui.addComponentType(UserInfoType.SOCIAL);
player.sendPacket(ui);
player.broadcastUserInfo(UserInfoType.SOCIAL);
player.checkItemRestriction();
// pk item rewards
if (Config.REWARD_PK_ITEM)
@ -942,9 +939,7 @@ public class Npc extends Creature
else if (Config.FAKE_PLAYER_KILL_PVP)
{
player.setPvpKills(player.getPvpKills() + 1);
final UserInfo ui = new UserInfo(player, false);
ui.addComponentType(UserInfoType.SOCIAL);
player.sendPacket(ui);
player.broadcastUserInfo(UserInfoType.SOCIAL);
// pvp item rewards
if (Config.REWARD_PVP_ITEM)
{

View File

@ -40,7 +40,6 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.StampedLock;
import java.util.logging.Level;
import java.util.stream.Collectors;
@ -727,11 +726,6 @@ public class PlayerInstance extends Playable
private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater;
/** Packet delay locks */
private final StampedLock _skillListPacketLock = new StampedLock();
private final StampedLock _userInfoPacketLock = new StampedLock();
private final StampedLock _storageMaxPacketLock = new StampedLock();
/** Last Html Npcs, 0 = last html was not bound to an npc */
private final int[] _htmlActionOriginObjectIds = new int[HtmlActionScope.values().length];
/**
@ -2262,16 +2256,6 @@ public class PlayerInstance extends Playable
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerEquipItem(this, item), this);
}
public boolean setStorageMaxCountPacketLock(boolean lock)
{
if (lock)
{
return _storageMaxPacketLock.tryWriteLock() != 0;
}
_storageMaxPacketLock.tryUnlockWrite();
return false;
}
/**
* @return the the PvP Kills of the PlayerInstance (Number of player killed during a PvP).
*/
@ -4111,16 +4095,6 @@ public class PlayerInstance extends Playable
}
}
public boolean setUserInfoPacketLock(boolean lock)
{
if (lock)
{
return _userInfoPacketLock.tryWriteLock() != 0;
}
_userInfoPacketLock.tryUnlockWrite();
return false;
}
/**
* Send a Server->Client packet UserInfo to this PlayerInstance and CharInfo to all PlayerInstance in its _KnownPlayers. <B><U> Concept</U> :</B> Others PlayerInstance in the detection area of the PlayerInstance are identified in <B>_knownPlayers</B>. In order to inform other players of this
* PlayerInstance state modifications, server just need to go through _knownPlayers to send Server->Client Packet <B><U> Actions</U> :</B>
@ -4193,9 +4167,7 @@ public class PlayerInstance extends Playable
public void broadcastTitleInfo()
{
// Send a Server->Client packet UserInfo to this PlayerInstance
final UserInfo ui = new UserInfo(this, false);
ui.addComponentType(UserInfoType.CLAN);
sendPacket(ui);
broadcastUserInfo(UserInfoType.CLAN);
// Send a Server->Client packet TitleUpdate to all PlayerInstance in _KnownPlayers of the PlayerInstance
broadcastPacket(new NicknameChanged(this));
@ -5251,9 +5223,7 @@ public class PlayerInstance extends Playable
}
}
final UserInfo ui = new UserInfo(this, false);
ui.addComponentType(UserInfoType.SOCIAL);
sendPacket(ui);
broadcastUserInfo(UserInfoType.SOCIAL);
checkItemRestriction();
}
@ -7927,9 +7897,7 @@ public class PlayerInstance extends Playable
sendPacket(new HennaInfo(this));
// Send Server->Client UserInfo packet to this PlayerInstance
final UserInfo ui = new UserInfo(this, false);
ui.addComponentType(UserInfoType.BASE_STATS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
sendPacket(ui);
broadcastUserInfo(UserInfoType.BASE_STATS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
final long currentTime = System.currentTimeMillis();
final long timeLeft = getVariables().getLong("HennaDuration" + slot, currentTime) - currentTime;
@ -8038,9 +8006,7 @@ public class PlayerInstance extends Playable
sendPacket(new HennaInfo(this));
// Send Server->Client UserInfo packet to this PlayerInstance
final UserInfo ui = new UserInfo(this, false);
ui.addComponentType(UserInfoType.BASE_STATS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
sendPacket(ui);
broadcastUserInfo(UserInfoType.BASE_STATS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
// Notify to scripts
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerHennaAdd(this, henna), this);
@ -8169,7 +8135,7 @@ public class PlayerInstance extends Playable
return false;
}
if (isLocked())
if (isSubclassLocked())
{
LOGGER.warning("Player " + getName() + " tried to restart/logout during class change.");
return false;
@ -9550,16 +9516,6 @@ public class PlayerInstance extends Playable
return _wantsPeace;
}
public boolean setSkillListPacketLock(boolean lock)
{
if (lock)
{
return _skillListPacketLock.tryWriteLock() != 0;
}
_skillListPacketLock.tryUnlockWrite();
return false;
}
public void sendSkillList()
{
sendSkillList(0);
@ -9877,13 +9833,12 @@ public class PlayerInstance extends Playable
* An index of zero specifies the character's original (base) class, while indexes 1-3 specifies the character's sub-classes respectively.<br>
* <font color="00FF00"/>WARNING: Use only on subclase change</font>
* @param classIndex
* @return
*/
public boolean setActiveClass(int classIndex)
public void setActiveClass(int classIndex)
{
if (!_subclassLock.tryLock())
{
return false;
return;
}
try
@ -9891,7 +9846,7 @@ public class PlayerInstance extends Playable
// Cannot switch or change subclasses while transformed
if (isTransformed())
{
return false;
return;
}
// Remove active item skills before saving char to database
@ -9946,7 +9901,7 @@ public class PlayerInstance extends Playable
catch (Exception e)
{
LOGGER.log(Level.WARNING, "Could not switch " + getName() + "'s sub class to class index " + classIndex + ": " + e.getMessage(), e);
return false;
return;
}
}
_classIndex = classIndex;
@ -10031,7 +9986,6 @@ public class PlayerInstance extends Playable
sendPacket(new ExStorageMaxCount(this));
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
return true;
}
finally
{
@ -10039,7 +9993,7 @@ public class PlayerInstance extends Playable
}
}
public boolean isLocked()
public boolean isSubclassLocked()
{
return _subclassLock.isLocked();
}
@ -12401,7 +12355,7 @@ public class PlayerInstance extends Playable
public boolean isAllowedToEnchantSkills()
{
if (isLocked())
if (isSubclassLocked())
{
return false;
}

View File

@ -307,9 +307,7 @@ public class PlayerStat extends PlayableStat
return false;
}
final UserInfo ui = new UserInfo(getActiveChar(), false);
ui.addComponentType(UserInfoType.CURRENT_HPMPCP_EXP_SP);
getActiveChar().sendPacket(ui);
getActiveChar().broadcastUserInfo(UserInfoType.CURRENT_HPMPCP_EXP_SP);
return true;
}

View File

@ -20,7 +20,6 @@ import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
/**
* @author Sdw
@ -42,8 +41,6 @@ public class NotifyExitBeautyShop implements IClientIncomingPacket
return;
}
final UserInfo userInfo = new UserInfo(player, false);
userInfo.addComponentType(UserInfoType.APPAREANCE);
client.sendPacket(userInfo);
player.broadcastUserInfo(UserInfoType.APPAREANCE);
}
}

View File

@ -20,7 +20,6 @@ import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.impl.SkillTreesData;
import org.l2jmobius.gameserver.model.SkillLearn;
@ -39,16 +38,11 @@ public class AcquireSkillList implements IClientOutgoingPacket
public AcquireSkillList(PlayerInstance player)
{
if (player.setSkillListPacketLock(true))
if (!player.isSubclassLocked()) // Changing class.
{
_player = player;
_learnable = SkillTreesData.getInstance().getAvailableSkills(player, player.getClassId(), false, true, false);
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(player, player.getClassId(), false, true, false));
ThreadPool.schedule(() ->
{
player.setSkillListPacketLock(false);
}, 300);
}
}

View File

@ -17,7 +17,6 @@
package org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.stats.Stats;
@ -42,7 +41,7 @@ public class ExStorageMaxCount implements IClientOutgoingPacket
public ExStorageMaxCount(PlayerInstance player)
{
if (player.setStorageMaxCountPacketLock(true))
if (!player.isSubclassLocked()) // Changing class.
{
_player = player;
_inventory = player.getInventoryLimit();
@ -55,11 +54,6 @@ public class ExStorageMaxCount implements IClientOutgoingPacket
_recipe = player.getCommonRecipeLimit();
_inventoryExtraSlots = (int) player.getStat().getValue(Stats.INVENTORY_NORMAL, 0);
_inventoryQuestItems = Config.INVENTORY_MAXIMUM_QUEST_ITEMS;
ThreadPool.schedule(() ->
{
player.setStorageMaxCountPacketLock(false);
}, 1000);
}
}

View File

@ -17,7 +17,6 @@
package org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.impl.ExperienceData;
import org.l2jmobius.gameserver.enums.AttributeType;
@ -63,31 +62,12 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
public UserInfo(PlayerInstance player)
{
_player = player;
_relation = calculateRelation(player);
_moveMultiplier = player.getMovementSpeedMultiplier();
_runSpd = (int) Math.round(player.getRunSpeed() / _moveMultiplier);
_walkSpd = (int) Math.round(player.getWalkSpeed() / _moveMultiplier);
_swimRunSpd = (int) Math.round(player.getSwimRunSpeed() / _moveMultiplier);
_swimWalkSpd = (int) Math.round(player.getSwimWalkSpeed() / _moveMultiplier);
_flyRunSpd = player.isFlying() ? _runSpd : 0;
_flyWalkSpd = player.isFlying() ? _walkSpd : 0;
_enchantLevel = player.getInventory().getWeaponEnchant();
_armorEnchant = player.getInventory().getArmorMinEnchant();
_title = player.getTitle();
if (player.isGM() && player.isInvisible())
{
_title = "[Invisible]";
}
addComponentType(UserInfoType.values());
this(player, true);
}
public UserInfo(PlayerInstance player, boolean addAll)
{
if (player.setUserInfoPacketLock(true))
if (!player.isSubclassLocked()) // Changing class.
{
_player = player;
@ -112,11 +92,6 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
{
addComponentType(UserInfoType.values());
}
ThreadPool.schedule(() ->
{
player.setUserInfoPacketLock(false);
}, 1000);
}
}