Removed packet locks and relative improvements.
This commit is contained in:
parent
3f1cf5d1a7
commit
b764d444df
@ -43,7 +43,6 @@ import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExChangeToAwakenedClass;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q10472_WindsOfFateEncroachingShadows.Q10472_WindsOfFateEncroachingShadows;
|
||||
@ -327,10 +326,7 @@ public class AwakeningMaster extends AbstractNpcAI
|
||||
player.setBaseClass(player.getActiveClass());
|
||||
}
|
||||
player.sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_A_CLASS_TRANSFER);
|
||||
final UserInfo ui = new UserInfo(player, false);
|
||||
ui.addComponentType(UserInfoType.BASIC_INFO);
|
||||
ui.addComponentType(UserInfoType.MAX_HPCPMP);
|
||||
player.sendPacket(ui);
|
||||
player.broadcastUserInfo(UserInfoType.BASIC_INFO, UserInfoType.MAX_HPCPMP);
|
||||
player.broadcastInfo();
|
||||
|
||||
player.broadcastPacket(new SocialAction(player.getObjectId(), 20));
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ability.ExAcquireAPSkillList;
|
||||
@ -54,41 +54,41 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -41,7 +41,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;
|
||||
|
||||
@ -720,11 +719,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];
|
||||
/**
|
||||
@ -2254,16 +2248,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).
|
||||
*/
|
||||
@ -4129,16 +4113,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>
|
||||
@ -4211,9 +4185,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));
|
||||
@ -5268,9 +5240,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
final UserInfo ui = new UserInfo(this, false);
|
||||
ui.addComponentType(UserInfoType.SOCIAL);
|
||||
sendPacket(ui);
|
||||
broadcastUserInfo(UserInfoType.SOCIAL);
|
||||
checkItemRestriction();
|
||||
}
|
||||
|
||||
@ -7944,9 +7914,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;
|
||||
@ -8055,9 +8023,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);
|
||||
@ -8186,7 +8152,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;
|
||||
@ -9563,16 +9529,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);
|
||||
@ -9885,13 +9841,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
|
||||
@ -9899,7 +9854,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
|
||||
@ -9954,7 +9909,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;
|
||||
@ -10039,7 +9994,6 @@ public class PlayerInstance extends Playable
|
||||
sendPacket(new ExStorageMaxCount(this));
|
||||
|
||||
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
|
||||
return true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@ -10047,7 +10001,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocked()
|
||||
public boolean isSubclassLocked()
|
||||
{
|
||||
return _subclassLock.isLocked();
|
||||
}
|
||||
@ -12416,7 +12370,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isAllowedToEnchantSkills()
|
||||
{
|
||||
if (isLocked())
|
||||
if (isSubclassLocked())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -310,9 +310,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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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, false);
|
||||
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(player, player.getClassId(), false, false));
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setSkillListPacketLock(false);
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
@ -62,31 +61,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;
|
||||
|
||||
@ -111,11 +91,6 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
|
||||
{
|
||||
addComponentType(UserInfoType.values());
|
||||
}
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setUserInfoPacketLock(false);
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,6 @@ import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExChangeToAwakenedClass;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q10472_WindsOfFateEncroachingShadows.Q10472_WindsOfFateEncroachingShadows;
|
||||
@ -327,10 +326,7 @@ public class AwakeningMaster extends AbstractNpcAI
|
||||
player.setBaseClass(player.getActiveClass());
|
||||
}
|
||||
player.sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_A_CLASS_TRANSFER);
|
||||
final UserInfo ui = new UserInfo(player, false);
|
||||
ui.addComponentType(UserInfoType.BASIC_INFO);
|
||||
ui.addComponentType(UserInfoType.MAX_HPCPMP);
|
||||
player.sendPacket(ui);
|
||||
player.broadcastUserInfo(UserInfoType.BASIC_INFO, UserInfoType.MAX_HPCPMP);
|
||||
player.broadcastInfo();
|
||||
|
||||
player.broadcastPacket(new SocialAction(player.getObjectId(), 20));
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ability.ExAcquireAPSkillList;
|
||||
@ -54,41 +54,41 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -41,7 +41,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;
|
||||
|
||||
@ -722,11 +721,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];
|
||||
/**
|
||||
@ -2260,16 +2254,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).
|
||||
*/
|
||||
@ -4135,16 +4119,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>
|
||||
@ -4217,9 +4191,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));
|
||||
@ -5274,9 +5246,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
final UserInfo ui = new UserInfo(this, false);
|
||||
ui.addComponentType(UserInfoType.SOCIAL);
|
||||
sendPacket(ui);
|
||||
broadcastUserInfo(UserInfoType.SOCIAL);
|
||||
checkItemRestriction();
|
||||
}
|
||||
|
||||
@ -7951,9 +7921,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;
|
||||
@ -8062,9 +8030,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);
|
||||
@ -8193,7 +8159,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;
|
||||
@ -9570,16 +9536,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);
|
||||
@ -9892,13 +9848,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
|
||||
@ -9906,7 +9861,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
|
||||
@ -9961,7 +9916,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;
|
||||
@ -10046,7 +10001,6 @@ public class PlayerInstance extends Playable
|
||||
sendPacket(new ExStorageMaxCount(this));
|
||||
|
||||
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
|
||||
return true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@ -10054,7 +10008,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocked()
|
||||
public boolean isSubclassLocked()
|
||||
{
|
||||
return _subclassLock.isLocked();
|
||||
}
|
||||
@ -12423,7 +12377,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isAllowedToEnchantSkills()
|
||||
{
|
||||
if (isLocked())
|
||||
if (isSubclassLocked())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -312,9 +312,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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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, false);
|
||||
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(player, player.getClassId(), false, false));
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setSkillListPacketLock(false);
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
@ -62,31 +61,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;
|
||||
|
||||
@ -111,11 +91,6 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
|
||||
{
|
||||
addComponentType(UserInfoType.values());
|
||||
}
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setUserInfoPacketLock(false);
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,6 @@ import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExChangeToAwakenedClass;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q10472_WindsOfFateEncroachingShadows.Q10472_WindsOfFateEncroachingShadows;
|
||||
@ -327,10 +326,7 @@ public class AwakeningMaster extends AbstractNpcAI
|
||||
player.setBaseClass(player.getActiveClass());
|
||||
}
|
||||
player.sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_A_CLASS_TRANSFER);
|
||||
final UserInfo ui = new UserInfo(player, false);
|
||||
ui.addComponentType(UserInfoType.BASIC_INFO);
|
||||
ui.addComponentType(UserInfoType.MAX_HPCPMP);
|
||||
player.sendPacket(ui);
|
||||
player.broadcastUserInfo(UserInfoType.BASIC_INFO, UserInfoType.MAX_HPCPMP);
|
||||
player.broadcastInfo();
|
||||
|
||||
player.broadcastPacket(new SocialAction(player.getObjectId(), 20));
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ability.ExAcquireAPSkillList;
|
||||
@ -54,41 +54,41 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -41,7 +41,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;
|
||||
|
||||
@ -724,11 +723,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).
|
||||
*/
|
||||
@ -4137,16 +4121,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>
|
||||
@ -4219,9 +4193,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));
|
||||
@ -5276,9 +5248,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
final UserInfo ui = new UserInfo(this, false);
|
||||
ui.addComponentType(UserInfoType.SOCIAL);
|
||||
sendPacket(ui);
|
||||
broadcastUserInfo(UserInfoType.SOCIAL);
|
||||
checkItemRestriction();
|
||||
}
|
||||
|
||||
@ -7953,9 +7923,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;
|
||||
@ -8064,9 +8032,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);
|
||||
@ -8195,7 +8161,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;
|
||||
@ -9572,16 +9538,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);
|
||||
@ -9894,13 +9850,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
|
||||
@ -9908,7 +9863,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
|
||||
@ -9963,7 +9918,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;
|
||||
@ -10048,7 +10003,6 @@ public class PlayerInstance extends Playable
|
||||
sendPacket(new ExStorageMaxCount(this));
|
||||
|
||||
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
|
||||
return true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@ -10056,7 +10010,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocked()
|
||||
public boolean isSubclassLocked()
|
||||
{
|
||||
return _subclassLock.isLocked();
|
||||
}
|
||||
@ -12425,7 +12379,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isAllowedToEnchantSkills()
|
||||
{
|
||||
if (isLocked())
|
||||
if (isSubclassLocked())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -312,9 +312,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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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, false);
|
||||
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(player, player.getClassId(), false, false));
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setSkillListPacketLock(false);
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
@ -62,31 +61,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;
|
||||
|
||||
@ -111,11 +91,6 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
|
||||
{
|
||||
addComponentType(UserInfoType.values());
|
||||
}
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setUserInfoPacketLock(false);
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,6 @@ import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExChangeToAwakenedClass;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q10472_WindsOfFateEncroachingShadows.Q10472_WindsOfFateEncroachingShadows;
|
||||
@ -327,10 +326,7 @@ public class AwakeningMaster extends AbstractNpcAI
|
||||
player.setBaseClass(player.getActiveClass());
|
||||
}
|
||||
player.sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_A_CLASS_TRANSFER);
|
||||
final UserInfo ui = new UserInfo(player, false);
|
||||
ui.addComponentType(UserInfoType.BASIC_INFO);
|
||||
ui.addComponentType(UserInfoType.MAX_HPCPMP);
|
||||
player.sendPacket(ui);
|
||||
player.broadcastUserInfo(UserInfoType.BASIC_INFO, UserInfoType.MAX_HPCPMP);
|
||||
player.broadcastInfo();
|
||||
|
||||
player.broadcastPacket(new SocialAction(player.getObjectId(), 20));
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ability.ExAcquireAPSkillList;
|
||||
@ -54,41 +54,41 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
||||
@ -731,11 +730,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];
|
||||
/**
|
||||
@ -2269,16 +2263,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).
|
||||
*/
|
||||
@ -4132,16 +4116,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>
|
||||
@ -4214,9 +4188,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));
|
||||
@ -5271,9 +5243,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
final UserInfo ui = new UserInfo(this, false);
|
||||
ui.addComponentType(UserInfoType.SOCIAL);
|
||||
sendPacket(ui);
|
||||
broadcastUserInfo(UserInfoType.SOCIAL);
|
||||
checkItemRestriction();
|
||||
}
|
||||
|
||||
@ -7948,9 +7918,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;
|
||||
@ -8059,9 +8027,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);
|
||||
@ -8190,7 +8156,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;
|
||||
@ -9563,16 +9529,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);
|
||||
@ -9885,13 +9841,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
|
||||
@ -9899,7 +9854,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
|
||||
@ -9954,7 +9909,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;
|
||||
@ -10039,7 +9994,6 @@ public class PlayerInstance extends Playable
|
||||
sendPacket(new ExStorageMaxCount(this));
|
||||
|
||||
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
|
||||
return true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@ -10047,7 +10001,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocked()
|
||||
public boolean isSubclassLocked()
|
||||
{
|
||||
return _subclassLock.isLocked();
|
||||
}
|
||||
@ -12406,7 +12360,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isAllowedToEnchantSkills()
|
||||
{
|
||||
if (isLocked())
|
||||
if (isSubclassLocked())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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, false);
|
||||
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(player, player.getClassId(), false, false));
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setSkillListPacketLock(false);
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,6 @@ import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExChangeToAwakenedClass;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q10472_WindsOfFateEncroachingShadows.Q10472_WindsOfFateEncroachingShadows;
|
||||
@ -327,10 +326,7 @@ public class AwakeningMaster extends AbstractNpcAI
|
||||
player.setBaseClass(player.getActiveClass());
|
||||
}
|
||||
player.sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_A_CLASS_TRANSFER);
|
||||
final UserInfo ui = new UserInfo(player, false);
|
||||
ui.addComponentType(UserInfoType.BASIC_INFO);
|
||||
ui.addComponentType(UserInfoType.MAX_HPCPMP);
|
||||
player.sendPacket(ui);
|
||||
player.broadcastUserInfo(UserInfoType.BASIC_INFO, UserInfoType.MAX_HPCPMP);
|
||||
player.broadcastInfo();
|
||||
|
||||
player.broadcastPacket(new SocialAction(player.getObjectId(), 20));
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ability.ExAcquireAPSkillList;
|
||||
@ -54,41 +54,41 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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).
|
||||
*/
|
||||
@ -4110,16 +4094,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>
|
||||
@ -4192,9 +4166,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));
|
||||
@ -5250,9 +5222,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
final UserInfo ui = new UserInfo(this, false);
|
||||
ui.addComponentType(UserInfoType.SOCIAL);
|
||||
sendPacket(ui);
|
||||
broadcastUserInfo(UserInfoType.SOCIAL);
|
||||
checkItemRestriction();
|
||||
}
|
||||
|
||||
@ -7926,9 +7896,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;
|
||||
@ -8037,9 +8005,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);
|
||||
@ -8168,7 +8134,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;
|
||||
@ -9549,16 +9515,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);
|
||||
@ -9871,13 +9827,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
|
||||
@ -9885,7 +9840,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
|
||||
@ -9940,7 +9895,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;
|
||||
@ -10025,7 +9980,6 @@ public class PlayerInstance extends Playable
|
||||
sendPacket(new ExStorageMaxCount(this));
|
||||
|
||||
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
|
||||
return true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@ -10033,7 +9987,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocked()
|
||||
public boolean isSubclassLocked()
|
||||
{
|
||||
return _subclassLock.isLocked();
|
||||
}
|
||||
@ -12392,7 +12346,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isAllowedToEnchantSkills()
|
||||
{
|
||||
if (isLocked())
|
||||
if (isSubclassLocked())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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, false);
|
||||
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(player, player.getClassId(), false, false));
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setSkillListPacketLock(false);
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,6 @@ import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExChangeToAwakenedClass;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q10472_WindsOfFateEncroachingShadows.Q10472_WindsOfFateEncroachingShadows;
|
||||
@ -327,10 +326,7 @@ public class AwakeningMaster extends AbstractNpcAI
|
||||
player.setBaseClass(player.getActiveClass());
|
||||
}
|
||||
player.sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_A_CLASS_TRANSFER);
|
||||
final UserInfo ui = new UserInfo(player, false);
|
||||
ui.addComponentType(UserInfoType.BASIC_INFO);
|
||||
ui.addComponentType(UserInfoType.MAX_HPCPMP);
|
||||
player.sendPacket(ui);
|
||||
player.broadcastUserInfo(UserInfoType.BASIC_INFO, UserInfoType.MAX_HPCPMP);
|
||||
player.broadcastInfo();
|
||||
|
||||
player.broadcastPacket(new SocialAction(player.getObjectId(), 20));
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ability.ExAcquireAPSkillList;
|
||||
@ -54,41 +54,41 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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).
|
||||
*/
|
||||
@ -4110,16 +4094,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>
|
||||
@ -4192,9 +4166,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));
|
||||
@ -5250,9 +5222,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
final UserInfo ui = new UserInfo(this, false);
|
||||
ui.addComponentType(UserInfoType.SOCIAL);
|
||||
sendPacket(ui);
|
||||
broadcastUserInfo(UserInfoType.SOCIAL);
|
||||
checkItemRestriction();
|
||||
}
|
||||
|
||||
@ -7926,9 +7896,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;
|
||||
@ -8037,9 +8005,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);
|
||||
@ -8168,7 +8134,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;
|
||||
@ -9549,16 +9515,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);
|
||||
@ -9871,13 +9827,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
|
||||
@ -9885,7 +9840,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
|
||||
@ -9940,7 +9895,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;
|
||||
@ -10025,7 +9980,6 @@ public class PlayerInstance extends Playable
|
||||
sendPacket(new ExStorageMaxCount(this));
|
||||
|
||||
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
|
||||
return true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@ -10033,7 +9987,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocked()
|
||||
public boolean isSubclassLocked()
|
||||
{
|
||||
return _subclassLock.isLocked();
|
||||
}
|
||||
@ -12395,7 +12349,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isAllowedToEnchantSkills()
|
||||
{
|
||||
if (isLocked())
|
||||
if (isSubclassLocked())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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, false);
|
||||
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(player, player.getClassId(), false, false));
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setSkillListPacketLock(false);
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,6 @@ import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExChangeToAwakenedClass;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q10472_WindsOfFateEncroachingShadows.Q10472_WindsOfFateEncroachingShadows;
|
||||
@ -327,10 +326,7 @@ public class AwakeningMaster extends AbstractNpcAI
|
||||
player.setBaseClass(player.getActiveClass());
|
||||
}
|
||||
player.sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_A_CLASS_TRANSFER);
|
||||
final UserInfo ui = new UserInfo(player, false);
|
||||
ui.addComponentType(UserInfoType.BASIC_INFO);
|
||||
ui.addComponentType(UserInfoType.MAX_HPCPMP);
|
||||
player.sendPacket(ui);
|
||||
player.broadcastUserInfo(UserInfoType.BASIC_INFO, UserInfoType.MAX_HPCPMP);
|
||||
player.broadcastInfo();
|
||||
|
||||
player.broadcastPacket(new SocialAction(player.getObjectId(), 20));
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ability.ExAcquireAPSkillList;
|
||||
@ -54,41 +54,41 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -42,7 +42,6 @@ import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExChangeToAwakenedClass;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExShowUsm;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SocialAction;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
@ -292,10 +291,7 @@ public class AwakeningMaster extends AbstractNpcAI
|
||||
player.setBaseClass(player.getActiveClass());
|
||||
}
|
||||
player.sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_A_CLASS_TRANSFER);
|
||||
final UserInfo ui = new UserInfo(player, false);
|
||||
ui.addComponentType(UserInfoType.BASIC_INFO);
|
||||
ui.addComponentType(UserInfoType.MAX_HPCPMP);
|
||||
player.sendPacket(ui);
|
||||
player.broadcastUserInfo(UserInfoType.BASIC_INFO, UserInfoType.MAX_HPCPMP);
|
||||
player.broadcastInfo();
|
||||
|
||||
player.broadcastPacket(new SocialAction(player.getObjectId(), 20));
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ability.ExAcquireAPSkillList;
|
||||
@ -54,42 +54,42 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.updateSymbolSealSkills();
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.updateSymbolSealSkills();
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(new ExAcquireAPSkillList(player));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
||||
@ -725,11 +724,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];
|
||||
/**
|
||||
@ -2182,16 +2176,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).
|
||||
*/
|
||||
@ -4031,16 +4015,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>
|
||||
@ -4113,9 +4087,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));
|
||||
@ -5171,9 +5143,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
final UserInfo ui = new UserInfo(this, false);
|
||||
ui.addComponentType(UserInfoType.SOCIAL);
|
||||
sendPacket(ui);
|
||||
broadcastUserInfo(UserInfoType.SOCIAL);
|
||||
checkItemRestriction();
|
||||
}
|
||||
|
||||
@ -7888,9 +7858,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;
|
||||
@ -7999,9 +7967,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);
|
||||
@ -8130,7 +8096,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;
|
||||
@ -9511,16 +9477,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);
|
||||
@ -9838,13 +9794,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
|
||||
@ -9852,7 +9807,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
|
||||
@ -9907,7 +9862,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;
|
||||
@ -9991,7 +9946,6 @@ public class PlayerInstance extends Playable
|
||||
sendPacket(new ExStorageMaxCount(this));
|
||||
|
||||
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSubChange(this), this);
|
||||
return true;
|
||||
}
|
||||
finally
|
||||
{
|
||||
@ -9999,7 +9953,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocked()
|
||||
public boolean isSubclassLocked()
|
||||
{
|
||||
return _subclassLock.isLocked();
|
||||
}
|
||||
@ -12347,7 +12301,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isAllowedToEnchantSkills()
|
||||
{
|
||||
if (isLocked())
|
||||
if (isSubclassLocked())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -305,9 +305,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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
@ -64,31 +63,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;
|
||||
|
||||
@ -113,11 +93,6 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
|
||||
{
|
||||
addComponentType(UserInfoType.values());
|
||||
}
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setUserInfoPacketLock(false);
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
|
||||
@ -53,40 +53,40 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -41,7 +41,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;
|
||||
|
||||
@ -718,11 +717,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];
|
||||
/**
|
||||
@ -2235,16 +2229,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).
|
||||
*/
|
||||
@ -4104,16 +4088,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>
|
||||
@ -4186,9 +4160,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));
|
||||
@ -8138,7 +8110,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;
|
||||
@ -9498,16 +9470,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);
|
||||
@ -9982,7 +9944,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocked()
|
||||
public boolean isSubclassLocked()
|
||||
{
|
||||
return _subclassLock.isLocked();
|
||||
}
|
||||
@ -12258,7 +12220,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isAllowedToEnchantSkills()
|
||||
{
|
||||
if (isLocked())
|
||||
if (isSubclassLocked())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,6 @@ package org.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
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;
|
||||
@ -37,16 +36,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, false);
|
||||
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(player, player.getClassId(), false, false));
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setSkillListPacketLock(false);
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.UserInfoType;
|
||||
@ -60,31 +59,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;
|
||||
|
||||
@ -109,11 +89,6 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
|
||||
{
|
||||
addComponentType(UserInfoType.values());
|
||||
}
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setUserInfoPacketLock(false);
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
|
||||
@ -53,40 +53,40 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -41,7 +41,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;
|
||||
|
||||
@ -719,11 +718,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];
|
||||
/**
|
||||
@ -2236,16 +2230,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).
|
||||
*/
|
||||
@ -4105,16 +4089,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>
|
||||
@ -4187,9 +4161,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));
|
||||
@ -8139,7 +8111,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;
|
||||
@ -9505,16 +9477,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);
|
||||
@ -9989,7 +9951,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocked()
|
||||
public boolean isSubclassLocked()
|
||||
{
|
||||
return _subclassLock.isLocked();
|
||||
}
|
||||
@ -12265,7 +12227,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isAllowedToEnchantSkills()
|
||||
{
|
||||
if (isLocked())
|
||||
if (isSubclassLocked())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,6 @@ package org.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
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;
|
||||
@ -37,16 +36,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, false);
|
||||
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(player, player.getClassId(), false, false));
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setSkillListPacketLock(false);
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.UserInfoType;
|
||||
@ -61,31 +60,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;
|
||||
|
||||
@ -110,11 +90,6 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
|
||||
{
|
||||
addComponentType(UserInfoType.values());
|
||||
}
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setUserInfoPacketLock(false);
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
|
||||
@ -53,40 +53,40 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -41,7 +41,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;
|
||||
|
||||
@ -717,11 +716,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];
|
||||
/**
|
||||
@ -2234,16 +2228,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).
|
||||
*/
|
||||
@ -4088,16 +4072,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>
|
||||
@ -4170,9 +4144,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));
|
||||
@ -8124,7 +8096,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;
|
||||
@ -9490,16 +9462,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);
|
||||
@ -9974,7 +9936,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocked()
|
||||
public boolean isSubclassLocked()
|
||||
{
|
||||
return _subclassLock.isLocked();
|
||||
}
|
||||
@ -12250,7 +12212,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isAllowedToEnchantSkills()
|
||||
{
|
||||
if (isLocked())
|
||||
if (isSubclassLocked())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,6 @@ package org.l2jmobius.gameserver.network.serverpackets;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
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;
|
||||
@ -37,16 +36,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, false);
|
||||
_learnable.addAll(SkillTreesData.getInstance().getNextAvailableSkills(player, player.getClassId(), false, false));
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setSkillListPacketLock(false);
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.UserInfoType;
|
||||
@ -61,31 +60,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;
|
||||
|
||||
@ -110,11 +90,6 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
|
||||
{
|
||||
addComponentType(UserInfoType.values());
|
||||
}
|
||||
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
player.setUserInfoPacketLock(false);
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,6 @@
|
||||
*/
|
||||
package handlers.effecthandlers;
|
||||
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -28,6 +27,7 @@ import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
|
||||
import org.l2jmobius.gameserver.model.skills.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.SystemMessage;
|
||||
|
||||
@ -53,40 +53,40 @@ public class ClassChange extends AbstractEffect
|
||||
@Override
|
||||
public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
|
||||
{
|
||||
if (effected.isPlayer())
|
||||
if (!effected.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
// TODO: FIX ME - Executing 100 ms later otherwise interupted exception during storeCharBase()
|
||||
ThreadPool.schedule(() ->
|
||||
{
|
||||
final int activeClass = player.getClassId().getId();
|
||||
|
||||
if (!player.setActiveClass(_index))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final Skill identifyCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identifyCrisis != null)
|
||||
{
|
||||
identifyCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
|
||||
final PlayerInstance player = effected.getActingPlayer();
|
||||
if (player.isTransformed() || player.isSubclassLocked() || player.isAffectedBySkill(IDENTITY_CRISIS_SKILL_ID))
|
||||
{
|
||||
player.sendMessage("You cannot switch your class right now!");
|
||||
return;
|
||||
}
|
||||
|
||||
final Skill identityCrisis = SkillData.getInstance().getSkill(IDENTITY_CRISIS_SKILL_ID, 1);
|
||||
if (identityCrisis != null)
|
||||
{
|
||||
identityCrisis.applyEffects(player, player);
|
||||
}
|
||||
|
||||
if (OlympiadManager.getInstance().isRegisteredInComp(player))
|
||||
{
|
||||
OlympiadManager.getInstance().unRegisterNoble(player);
|
||||
}
|
||||
|
||||
final int activeClass = player.getClassId().getId();
|
||||
player.setActiveClass(_index);
|
||||
|
||||
final SystemMessage msg = new SystemMessage(SystemMessageId.YOU_HAVE_SUCCESSFULLY_SWITCHED_S1_TO_S2);
|
||||
msg.addClassId(activeClass);
|
||||
msg.addClassId(player.getClassId().getId());
|
||||
player.sendPacket(msg);
|
||||
|
||||
player.broadcastUserInfo();
|
||||
player.sendPacket(new ExStorageMaxCount(player));
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
}
|
||||
}
|
||||
|
@ -98,7 +98,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;
|
||||
|
||||
@ -921,9 +920,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)
|
||||
@ -954,9 +951,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)
|
||||
{
|
||||
|
@ -41,7 +41,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;
|
||||
|
||||
@ -724,11 +723,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];
|
||||
/**
|
||||
@ -2244,16 +2238,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).
|
||||
*/
|
||||
@ -4099,16 +4083,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>
|
||||
@ -4181,9 +4155,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));
|
||||
@ -8151,7 +8123,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;
|
||||
@ -9517,16 +9489,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);
|
||||
@ -10001,7 +9963,7 @@ public class PlayerInstance extends Playable
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLocked()
|
||||
public boolean isSubclassLocked()
|
||||
{
|
||||
return _subclassLock.isLocked();
|
||||
}
|
||||
@ -12292,7 +12254,7 @@ public class PlayerInstance extends Playable
|
||||
|
||||
public boolean isAllowedToEnchantSkills()
|
||||
{
|
||||
if (isLocked())
|
||||
if (isSubclassLocked())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -308,9 +308,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;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user