Removed several synchronized locks.

This commit is contained in:
MobiusDevelopment
2019-06-30 23:11:52 +00:00
parent ff0b12f059
commit a0fe112150
45 changed files with 646 additions and 1664 deletions
@@ -414,12 +414,9 @@ public final class FeedableBeasts extends AbstractNpcAI
// player might have and initialize the Tamed Beast. // player might have and initialize the Tamed Beast.
if (CommonUtil.contains(TAMED_BEASTS, nextNpcId)) if (CommonUtil.contains(TAMED_BEASTS, nextNpcId))
{ {
if ((player.getTrainedBeasts() != null) && !player.getTrainedBeasts().isEmpty()) for (TamedBeastInstance oldTrained : player.getTrainedBeasts())
{ {
for (TamedBeastInstance oldTrained : player.getTrainedBeasts()) oldTrained.deleteMe();
{
oldTrained.deleteMe();
}
} }
final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ()); final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ());
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -51,7 +51,6 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.GameTimeController; import org.l2jmobius.gameserver.GameTimeController;
import org.l2jmobius.gameserver.ItemsAutoDestroy; import org.l2jmobius.gameserver.ItemsAutoDestroy;
import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread;
import org.l2jmobius.gameserver.RecipeController;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.ai.PlayerAI; import org.l2jmobius.gameserver.ai.PlayerAI;
@@ -114,6 +113,7 @@ import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
import org.l2jmobius.gameserver.instancemanager.PunishmentManager; import org.l2jmobius.gameserver.instancemanager.PunishmentManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.SellBuffsManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.AccessLevel; import org.l2jmobius.gameserver.model.AccessLevel;
@@ -596,12 +596,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
private boolean _minimapAllowed = false; private boolean _minimapAllowed = false;
@@ -673,7 +673,7 @@ public final class PlayerInstance extends Playable
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -690,7 +690,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -713,7 +713,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private final Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -2025,11 +2025,7 @@ public final class PlayerInstance extends Playable
public int getWeightPenalty() public int getWeightPenalty()
{ {
if (_dietMode) return _dietMode ? 0 : _curWeightPenalty;
{
return 0;
}
return _curWeightPenalty;
} }
/** /**
@@ -4306,7 +4302,14 @@ public final class PlayerInstance extends Playable
if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL)) if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL))
{ {
sendPacket(new PrivateStoreListSell(this, targetPlayer)); if (_isSellingBuffs)
{
SellBuffsManager.getInstance().sendBuffMenu(this, targetPlayer, 0);
}
else
{
sendPacket(new PrivateStoreListSell(this, targetPlayer));
}
} }
else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY) else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY)
{ {
@@ -5026,13 +5029,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5454,7 +5457,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5505,16 +5508,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5532,16 +5525,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10432,14 +10415,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10539,12 +10519,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -10936,16 +10913,6 @@ public final class PlayerInstance extends Playable
LOGGER.log(Level.SEVERE, "deleteMe()", e); LOGGER.log(Level.SEVERE, "deleteMe()", e);
} }
// Stop crafting, if in progress
try
{
RecipeController.getInstance().requestMakeItemAbort(this);
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "deleteMe()", e);
}
// Cancel Attak or Cast // Cancel Attak or Cast
try try
{ {
@@ -11750,38 +11717,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11791,8 +11747,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11804,8 +11759,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11838,7 +11792,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13250,7 +13204,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13293,7 +13247,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13312,7 +13266,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13331,7 +13285,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13699,22 +13653,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13723,7 +13667,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13733,7 +13677,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13741,12 +13685,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13757,7 +13701,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13777,7 +13721,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13786,7 +13730,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13818,16 +13762,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13918,16 +13852,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13937,7 +13861,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13951,11 +13875,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13964,11 +13887,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13978,11 +13900,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -414,12 +414,9 @@ public final class FeedableBeasts extends AbstractNpcAI
// player might have and initialize the Tamed Beast. // player might have and initialize the Tamed Beast.
if (CommonUtil.contains(TAMED_BEASTS, nextNpcId)) if (CommonUtil.contains(TAMED_BEASTS, nextNpcId))
{ {
if ((player.getTrainedBeasts() != null) && !player.getTrainedBeasts().isEmpty()) for (TamedBeastInstance oldTrained : player.getTrainedBeasts())
{ {
for (TamedBeastInstance oldTrained : player.getTrainedBeasts()) oldTrained.deleteMe();
{
oldTrained.deleteMe();
}
} }
final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ()); final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ());
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -51,7 +51,6 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.GameTimeController; import org.l2jmobius.gameserver.GameTimeController;
import org.l2jmobius.gameserver.ItemsAutoDestroy; import org.l2jmobius.gameserver.ItemsAutoDestroy;
import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread;
import org.l2jmobius.gameserver.RecipeController;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.ai.PlayerAI; import org.l2jmobius.gameserver.ai.PlayerAI;
@@ -115,6 +114,7 @@ import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
import org.l2jmobius.gameserver.instancemanager.PunishmentManager; import org.l2jmobius.gameserver.instancemanager.PunishmentManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.SellBuffsManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.AccessLevel; import org.l2jmobius.gameserver.model.AccessLevel;
@@ -598,12 +598,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
private boolean _minimapAllowed = false; private boolean _minimapAllowed = false;
@@ -675,7 +675,7 @@ public final class PlayerInstance extends Playable
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -692,7 +692,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -715,7 +715,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private final Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -2031,11 +2031,7 @@ public final class PlayerInstance extends Playable
public int getWeightPenalty() public int getWeightPenalty()
{ {
if (_dietMode) return _dietMode ? 0 : _curWeightPenalty;
{
return 0;
}
return _curWeightPenalty;
} }
/** /**
@@ -4312,7 +4308,14 @@ public final class PlayerInstance extends Playable
if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL)) if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL))
{ {
sendPacket(new PrivateStoreListSell(this, targetPlayer)); if (_isSellingBuffs)
{
SellBuffsManager.getInstance().sendBuffMenu(this, targetPlayer, 0);
}
else
{
sendPacket(new PrivateStoreListSell(this, targetPlayer));
}
} }
else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY) else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY)
{ {
@@ -5032,13 +5035,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5460,7 +5463,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5511,16 +5514,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5538,16 +5531,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10439,14 +10422,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10546,12 +10526,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -10943,16 +10920,6 @@ public final class PlayerInstance extends Playable
LOGGER.log(Level.SEVERE, "deleteMe()", e); LOGGER.log(Level.SEVERE, "deleteMe()", e);
} }
// Stop crafting, if in progress
try
{
RecipeController.getInstance().requestMakeItemAbort(this);
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "deleteMe()", e);
}
// Cancel Attak or Cast // Cancel Attak or Cast
try try
{ {
@@ -11757,38 +11724,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11798,8 +11754,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11811,8 +11766,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11845,7 +11799,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13257,7 +13211,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13300,7 +13254,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13319,7 +13273,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13338,7 +13292,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13706,22 +13660,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13730,7 +13674,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13740,7 +13684,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13748,12 +13692,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13764,7 +13708,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13784,7 +13728,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13793,7 +13737,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13825,16 +13769,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13925,16 +13859,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13944,7 +13868,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13958,11 +13882,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13971,11 +13894,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13985,11 +13907,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -414,12 +414,9 @@ public final class FeedableBeasts extends AbstractNpcAI
// player might have and initialize the Tamed Beast. // player might have and initialize the Tamed Beast.
if (CommonUtil.contains(TAMED_BEASTS, nextNpcId)) if (CommonUtil.contains(TAMED_BEASTS, nextNpcId))
{ {
if ((player.getTrainedBeasts() != null) && !player.getTrainedBeasts().isEmpty()) for (TamedBeastInstance oldTrained : player.getTrainedBeasts())
{ {
for (TamedBeastInstance oldTrained : player.getTrainedBeasts()) oldTrained.deleteMe();
{
oldTrained.deleteMe();
}
} }
final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ()); final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ());
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -51,7 +51,6 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.GameTimeController; import org.l2jmobius.gameserver.GameTimeController;
import org.l2jmobius.gameserver.ItemsAutoDestroy; import org.l2jmobius.gameserver.ItemsAutoDestroy;
import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread;
import org.l2jmobius.gameserver.RecipeController;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.ai.PlayerAI; import org.l2jmobius.gameserver.ai.PlayerAI;
@@ -116,6 +115,7 @@ import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
import org.l2jmobius.gameserver.instancemanager.PunishmentManager; import org.l2jmobius.gameserver.instancemanager.PunishmentManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.SellBuffsManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.AccessLevel; import org.l2jmobius.gameserver.model.AccessLevel;
@@ -600,12 +600,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
private boolean _minimapAllowed = false; private boolean _minimapAllowed = false;
@@ -677,7 +677,7 @@ public final class PlayerInstance extends Playable
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -694,7 +694,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -717,7 +717,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private final Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -2033,11 +2033,7 @@ public final class PlayerInstance extends Playable
public int getWeightPenalty() public int getWeightPenalty()
{ {
if (_dietMode) return _dietMode ? 0 : _curWeightPenalty;
{
return 0;
}
return _curWeightPenalty;
} }
/** /**
@@ -4314,7 +4310,14 @@ public final class PlayerInstance extends Playable
if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL)) if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL))
{ {
sendPacket(new PrivateStoreListSell(this, targetPlayer)); if (_isSellingBuffs)
{
SellBuffsManager.getInstance().sendBuffMenu(this, targetPlayer, 0);
}
else
{
sendPacket(new PrivateStoreListSell(this, targetPlayer));
}
} }
else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY) else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY)
{ {
@@ -5034,13 +5037,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5462,7 +5465,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5513,16 +5516,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5540,16 +5533,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10441,14 +10424,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10548,12 +10528,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -10945,16 +10922,6 @@ public final class PlayerInstance extends Playable
LOGGER.log(Level.SEVERE, "deleteMe()", e); LOGGER.log(Level.SEVERE, "deleteMe()", e);
} }
// Stop crafting, if in progress
try
{
RecipeController.getInstance().requestMakeItemAbort(this);
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "deleteMe()", e);
}
// Cancel Attak or Cast // Cancel Attak or Cast
try try
{ {
@@ -11759,38 +11726,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11800,8 +11756,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11813,8 +11768,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11847,7 +11801,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13260,7 +13214,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13303,7 +13257,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13322,7 +13276,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13341,7 +13295,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13709,22 +13663,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13733,7 +13677,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13743,7 +13687,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13751,12 +13695,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13767,7 +13711,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13787,7 +13731,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13796,7 +13740,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13828,16 +13772,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13928,16 +13862,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13947,7 +13871,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13961,11 +13885,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13974,11 +13897,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13988,11 +13910,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -414,12 +414,9 @@ public final class FeedableBeasts extends AbstractNpcAI
// player might have and initialize the Tamed Beast. // player might have and initialize the Tamed Beast.
if (CommonUtil.contains(TAMED_BEASTS, nextNpcId)) if (CommonUtil.contains(TAMED_BEASTS, nextNpcId))
{ {
if ((player.getTrainedBeasts() != null) && !player.getTrainedBeasts().isEmpty()) for (TamedBeastInstance oldTrained : player.getTrainedBeasts())
{ {
for (TamedBeastInstance oldTrained : player.getTrainedBeasts()) oldTrained.deleteMe();
{
oldTrained.deleteMe();
}
} }
final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ()); final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ());
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -605,12 +605,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
// client radar // client radar
// TODO: This needs to be better integrated and saved/loaded // TODO: This needs to be better integrated and saved/loaded
@@ -677,10 +677,10 @@ public final class PlayerInstance extends Playable
private long _spawnProtectEndTime = 0; private long _spawnProtectEndTime = 0;
private long _teleportProtectEndTime = 0; private long _teleportProtectEndTime = 0;
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos = new ConcurrentHashMap<>();
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -701,7 +701,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -724,7 +724,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -5032,13 +5032,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5460,7 +5460,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5511,16 +5511,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5538,16 +5528,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10435,14 +10415,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10542,12 +10519,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -11743,38 +11717,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11784,8 +11747,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11797,8 +11759,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11831,7 +11792,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13243,7 +13204,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13286,7 +13247,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13305,7 +13266,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13324,7 +13285,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13684,22 +13645,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13708,7 +13659,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13718,7 +13669,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13726,12 +13677,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13742,7 +13693,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13762,7 +13713,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13771,7 +13722,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13803,16 +13754,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13903,16 +13844,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13922,7 +13853,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13936,11 +13867,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13949,11 +13879,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13963,11 +13892,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -414,12 +414,9 @@ public final class FeedableBeasts extends AbstractNpcAI
// player might have and initialize the Tamed Beast. // player might have and initialize the Tamed Beast.
if (CommonUtil.contains(TAMED_BEASTS, nextNpcId)) if (CommonUtil.contains(TAMED_BEASTS, nextNpcId))
{ {
if ((player.getTrainedBeasts() != null) && !player.getTrainedBeasts().isEmpty()) for (TamedBeastInstance oldTrained : player.getTrainedBeasts())
{ {
for (TamedBeastInstance oldTrained : player.getTrainedBeasts()) oldTrained.deleteMe();
{
oldTrained.deleteMe();
}
} }
final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ()); final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ());
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -603,12 +603,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
// client radar // client radar
// TODO: This needs to be better integrated and saved/loaded // TODO: This needs to be better integrated and saved/loaded
@@ -675,10 +675,10 @@ public final class PlayerInstance extends Playable
private long _spawnProtectEndTime = 0; private long _spawnProtectEndTime = 0;
private long _teleportProtectEndTime = 0; private long _teleportProtectEndTime = 0;
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos = new ConcurrentHashMap<>();
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -699,7 +699,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -722,7 +722,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -5013,13 +5013,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5441,7 +5441,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5492,16 +5492,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5519,16 +5509,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10425,14 +10405,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10532,12 +10509,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -11733,38 +11707,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11774,8 +11737,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11787,8 +11749,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11821,7 +11782,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13233,7 +13194,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13276,7 +13237,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13295,7 +13256,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13314,7 +13275,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13674,22 +13635,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13698,7 +13649,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13708,7 +13659,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13716,12 +13667,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13732,7 +13683,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13752,7 +13703,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13761,7 +13712,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13793,16 +13744,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13892,16 +13833,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13911,7 +13842,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13925,11 +13856,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13938,11 +13868,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13952,11 +13881,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -413,12 +413,9 @@ public final class FeedableBeasts extends AbstractNpcAI
// player might have and initialize the Tamed Beast. // player might have and initialize the Tamed Beast.
if (CommonUtil.contains(TAMED_BEASTS, nextNpcId)) if (CommonUtil.contains(TAMED_BEASTS, nextNpcId))
{ {
if ((player.getTrainedBeasts() != null) && !player.getTrainedBeasts().isEmpty()) for (TamedBeastInstance oldTrained : player.getTrainedBeasts())
{ {
for (TamedBeastInstance oldTrained : player.getTrainedBeasts()) oldTrained.deleteMe();
{
oldTrained.deleteMe();
}
} }
final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ()); final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ());
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -603,12 +603,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
// client radar // client radar
// TODO: This needs to be better integrated and saved/loaded // TODO: This needs to be better integrated and saved/loaded
@@ -675,10 +675,10 @@ public final class PlayerInstance extends Playable
private long _spawnProtectEndTime = 0; private long _spawnProtectEndTime = 0;
private long _teleportProtectEndTime = 0; private long _teleportProtectEndTime = 0;
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos = new ConcurrentHashMap<>();
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -699,7 +699,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -722,7 +722,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -5013,13 +5013,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5441,7 +5441,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5492,16 +5492,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5519,16 +5509,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10425,14 +10405,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10532,12 +10509,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -11733,38 +11707,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11774,8 +11737,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11787,8 +11749,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11821,7 +11782,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13233,7 +13194,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13276,7 +13237,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13295,7 +13256,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13314,7 +13275,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13674,22 +13635,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13698,7 +13649,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13708,7 +13659,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13716,12 +13667,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13732,7 +13683,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13752,7 +13703,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13761,7 +13712,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13793,16 +13744,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13892,16 +13833,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13911,7 +13842,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13925,11 +13856,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13938,11 +13868,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13952,11 +13881,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -413,12 +413,9 @@ public final class FeedableBeasts extends AbstractNpcAI
// player might have and initialize the Tamed Beast. // player might have and initialize the Tamed Beast.
if (CommonUtil.contains(TAMED_BEASTS, nextNpcId)) if (CommonUtil.contains(TAMED_BEASTS, nextNpcId))
{ {
if ((player.getTrainedBeasts() != null) && !player.getTrainedBeasts().isEmpty()) for (TamedBeastInstance oldTrained : player.getTrainedBeasts())
{ {
for (TamedBeastInstance oldTrained : player.getTrainedBeasts()) oldTrained.deleteMe();
{
oldTrained.deleteMe();
}
} }
final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ()); final TamedBeastInstance nextNpc = new TamedBeastInstance(nextNpcId, player, food - FOODSKILLDIFF, npc.getX(), npc.getY(), npc.getZ());
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -603,12 +603,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
// client radar // client radar
// TODO: This needs to be better integrated and saved/loaded // TODO: This needs to be better integrated and saved/loaded
@@ -675,10 +675,10 @@ public final class PlayerInstance extends Playable
private long _spawnProtectEndTime = 0; private long _spawnProtectEndTime = 0;
private long _teleportProtectEndTime = 0; private long _teleportProtectEndTime = 0;
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos = new ConcurrentHashMap<>();
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -699,7 +699,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -722,7 +722,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -5014,13 +5014,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5442,7 +5442,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5493,16 +5493,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5520,16 +5510,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10431,14 +10411,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10538,12 +10515,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -11739,38 +11713,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11780,8 +11743,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11793,8 +11755,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11827,7 +11788,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13239,7 +13200,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13282,7 +13243,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13301,7 +13262,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13320,7 +13281,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13680,22 +13641,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13704,7 +13655,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13714,7 +13665,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13722,12 +13673,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13738,7 +13689,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13758,7 +13709,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13767,7 +13718,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13799,16 +13750,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13898,16 +13839,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13917,7 +13848,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13931,11 +13862,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13944,11 +13874,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13958,11 +13887,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -31,7 +31,6 @@ import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@@ -462,7 +461,7 @@ public final class PlayerInstance extends Playable
private int _masteryPenalty = 0; private int _masteryPenalty = 0;
private ItemInstance _activeEnchantItem = null; private ItemInstance _activeEnchantItem = null;
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
protected Map<Integer, CubicInstance> _cubics = new HashMap<>(); protected Map<Integer, CubicInstance> _cubics = new ConcurrentHashMap<>();
protected Map<Integer, Integer> _activeSoulShots = new ConcurrentHashMap<>(); protected Map<Integer, Integer> _activeSoulShots = new ConcurrentHashMap<>();
public final ReentrantLock soulShotLock = new ReentrantLock(); public final ReentrantLock soulShotLock = new ReentrantLock();
public Quest dialog = null; public Quest dialog = null;
@@ -710,14 +709,11 @@ public final class PlayerInstance extends Playable
// cancel the recent fake-death protection instantly if the player attacks or casts spells // cancel the recent fake-death protection instantly if the player attacks or casts spells
getPlayer().setRecentFakeDeath(false); getPlayer().setRecentFakeDeath(false);
synchronized (_cubics) for (CubicInstance cubic : _cubics.values())
{ {
for (CubicInstance cubic : _cubics.values()) if (cubic.getId() != CubicInstance.LIFE_CUBIC)
{ {
if (cubic.getId() != CubicInstance.LIFE_CUBIC) cubic.doAction();
{
cubic.doAction();
}
} }
} }
} }
@@ -769,14 +765,11 @@ public final class PlayerInstance extends Playable
return; return;
} }
synchronized (_cubics) for (CubicInstance cubic : _cubics.values())
{ {
for (CubicInstance cubic : _cubics.values()) if ((cubic != null) && (cubic.getId() != CubicInstance.LIFE_CUBIC))
{ {
if ((cubic != null) && (cubic.getId() != CubicInstance.LIFE_CUBIC)) cubic.doAction();
{
cubic.doAction();
}
} }
} }
break; break;
@@ -1328,7 +1321,6 @@ public final class PlayerInstance extends Playable
} }
} }
} }
return _ai; return _ai;
} }
@@ -3571,7 +3563,6 @@ public final class PlayerInstance extends Playable
{ {
synchronized (_movingTaskDefined) synchronized (_movingTaskDefined)
{ {
if (!_movingTaskDefined) if (!_movingTaskDefined)
{ {
return; return;
@@ -11911,28 +11902,23 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, CubicInstance> getCubics() public Map<Integer, CubicInstance> getCubics()
{ {
synchronized (_cubics) // clean cubics instances
for (Integer id : _cubics.keySet())
{ {
// clean cubics instances if ((id == null) || (_cubics.get(id) == null))
final Set<Integer> cubicsIds = _cubics.keySet();
for (Integer id : cubicsIds)
{ {
if ((id == null) || (_cubics.get(id) == null)) try
{ {
try _cubics.remove(id);
{ }
_cubics.remove(id); catch (NullPointerException e)
} {
catch (NullPointerException e) // FIXME: tried to remove a null key, to be found where this action has been performed (DEGUB)
{
// FIXME: tried to remove a null key, to be found where this action has been performed (DEGUB)
}
} }
} }
return _cubics;
} }
return _cubics;
} }
/** /**
@@ -11949,11 +11935,7 @@ public final class PlayerInstance extends Playable
public void addCubic(int id, int level, double matk, int activationtime, int activationchance, int totalLifetime, boolean givenByOther) public void addCubic(int id, int level, double matk, int activationtime, int activationchance, int totalLifetime, boolean givenByOther)
{ {
final CubicInstance cubic = new CubicInstance(this, id, level, (int) matk, activationtime, activationchance, totalLifetime, givenByOther); final CubicInstance cubic = new CubicInstance(this, id, level, (int) matk, activationtime, activationchance, totalLifetime, givenByOther);
_cubics.put(id, cubic);
synchronized (_cubics)
{
_cubics.put(id, cubic);
}
} }
/** /**
@@ -11963,10 +11945,7 @@ public final class PlayerInstance extends Playable
*/ */
public void delCubic(int id) public void delCubic(int id)
{ {
synchronized (_cubics) _cubics.remove(id);
{
_cubics.remove(id);
}
} }
/** /**
@@ -11977,27 +11956,21 @@ public final class PlayerInstance extends Playable
*/ */
public CubicInstance getCubic(int id) public CubicInstance getCubic(int id)
{ {
synchronized (_cubics) return _cubics.get(id);
{
return _cubics.get(id);
}
} }
public void unsummonAllCubics() public void unsummonAllCubics()
{ {
// Unsummon Cubics // Unsummon Cubics
synchronized (_cubics) if (_cubics.size() > 0)
{ {
if (_cubics.size() > 0) for (CubicInstance cubic : _cubics.values())
{ {
for (CubicInstance cubic : _cubics.values()) cubic.stopAction();
{ cubic.cancelDisappear();
cubic.stopAction();
cubic.cancelDisappear();
}
_cubics.clear();
} }
_cubics.clear();
} }
} }
@@ -13700,12 +13673,10 @@ public final class PlayerInstance extends Playable
synchronized (getAllSkills()) synchronized (getAllSkills())
{ {
for (Skill oldSkill : getAllSkills()) for (Skill oldSkill : getAllSkills())
{ {
super.removeSkill(oldSkill); super.removeSkill(oldSkill);
} }
} }
// Rebind CursedWeapon passive. // Rebind CursedWeapon passive.
@@ -5008,13 +5008,13 @@ public final class PlayerInstance extends Playable
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (_isFakeDeath)
{ {
if (_isFakeDeath) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
if (killer != null) if (killer != null)
{ {
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -51,7 +51,6 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.GameTimeController; import org.l2jmobius.gameserver.GameTimeController;
import org.l2jmobius.gameserver.ItemsAutoDestroy; import org.l2jmobius.gameserver.ItemsAutoDestroy;
import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread;
import org.l2jmobius.gameserver.RecipeController;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.ai.PlayerAI; import org.l2jmobius.gameserver.ai.PlayerAI;
@@ -115,6 +114,7 @@ import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
import org.l2jmobius.gameserver.instancemanager.PunishmentManager; import org.l2jmobius.gameserver.instancemanager.PunishmentManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.SellBuffsManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.AccessLevel; import org.l2jmobius.gameserver.model.AccessLevel;
@@ -594,12 +594,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
private boolean _minimapAllowed = false; private boolean _minimapAllowed = false;
@@ -671,7 +671,7 @@ public final class PlayerInstance extends Playable
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -688,7 +688,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -711,7 +711,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private final Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -2006,11 +2006,7 @@ public final class PlayerInstance extends Playable
public int getWeightPenalty() public int getWeightPenalty()
{ {
if (_dietMode) return _dietMode ? 0 : _curWeightPenalty;
{
return 0;
}
return _curWeightPenalty;
} }
/** /**
@@ -4281,7 +4277,14 @@ public final class PlayerInstance extends Playable
if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL)) if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL))
{ {
sendPacket(new PrivateStoreListSell(this, targetPlayer)); if (_isSellingBuffs)
{
SellBuffsManager.getInstance().sendBuffMenu(this, targetPlayer, 0);
}
else
{
sendPacket(new PrivateStoreListSell(this, targetPlayer));
}
} }
else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY) else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY)
{ {
@@ -4998,13 +5001,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5425,7 +5428,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5476,16 +5479,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5503,16 +5496,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10367,14 +10350,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10474,12 +10454,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -10871,16 +10848,6 @@ public final class PlayerInstance extends Playable
LOGGER.log(Level.SEVERE, "deleteMe()", e); LOGGER.log(Level.SEVERE, "deleteMe()", e);
} }
// Stop crafting, if in progress
try
{
RecipeController.getInstance().requestMakeItemAbort(this);
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "deleteMe()", e);
}
// Cancel Attak or Cast // Cancel Attak or Cast
try try
{ {
@@ -11592,38 +11559,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11633,8 +11589,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11646,8 +11601,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11680,7 +11634,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13093,7 +13047,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13136,7 +13090,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13155,7 +13109,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13174,7 +13128,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13542,22 +13496,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13566,7 +13510,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13576,7 +13520,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13584,12 +13528,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13600,7 +13544,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13620,7 +13564,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13629,7 +13573,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13661,16 +13605,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13761,16 +13695,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13780,7 +13704,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13794,11 +13718,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13807,11 +13730,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13821,11 +13743,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -51,7 +51,6 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.GameTimeController; import org.l2jmobius.gameserver.GameTimeController;
import org.l2jmobius.gameserver.ItemsAutoDestroy; import org.l2jmobius.gameserver.ItemsAutoDestroy;
import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread;
import org.l2jmobius.gameserver.RecipeController;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.ai.PlayerAI; import org.l2jmobius.gameserver.ai.PlayerAI;
@@ -115,6 +114,7 @@ import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
import org.l2jmobius.gameserver.instancemanager.PunishmentManager; import org.l2jmobius.gameserver.instancemanager.PunishmentManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.SellBuffsManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.AccessLevel; import org.l2jmobius.gameserver.model.AccessLevel;
@@ -595,12 +595,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
private boolean _minimapAllowed = false; private boolean _minimapAllowed = false;
@@ -672,7 +672,7 @@ public final class PlayerInstance extends Playable
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -689,7 +689,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -712,7 +712,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private final Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -2007,11 +2007,7 @@ public final class PlayerInstance extends Playable
public int getWeightPenalty() public int getWeightPenalty()
{ {
if (_dietMode) return _dietMode ? 0 : _curWeightPenalty;
{
return 0;
}
return _curWeightPenalty;
} }
/** /**
@@ -4282,7 +4278,14 @@ public final class PlayerInstance extends Playable
if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL)) if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL))
{ {
sendPacket(new PrivateStoreListSell(this, targetPlayer)); if (_isSellingBuffs)
{
SellBuffsManager.getInstance().sendBuffMenu(this, targetPlayer, 0);
}
else
{
sendPacket(new PrivateStoreListSell(this, targetPlayer));
}
} }
else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY) else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY)
{ {
@@ -4999,13 +5002,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5426,7 +5429,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5477,16 +5480,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5504,16 +5497,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10374,14 +10357,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10481,12 +10461,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -10878,16 +10855,6 @@ public final class PlayerInstance extends Playable
LOGGER.log(Level.SEVERE, "deleteMe()", e); LOGGER.log(Level.SEVERE, "deleteMe()", e);
} }
// Stop crafting, if in progress
try
{
RecipeController.getInstance().requestMakeItemAbort(this);
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "deleteMe()", e);
}
// Cancel Attak or Cast // Cancel Attak or Cast
try try
{ {
@@ -11599,38 +11566,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11640,8 +11596,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11653,8 +11608,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11687,7 +11641,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13100,7 +13054,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13143,7 +13097,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13162,7 +13116,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13181,7 +13135,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13549,22 +13503,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13573,7 +13517,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13583,7 +13527,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13591,12 +13535,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13607,7 +13551,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13627,7 +13571,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13636,7 +13580,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13668,16 +13612,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13768,16 +13702,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13787,7 +13711,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13801,11 +13725,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13814,11 +13737,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13828,11 +13750,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -51,7 +51,6 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.GameTimeController; import org.l2jmobius.gameserver.GameTimeController;
import org.l2jmobius.gameserver.ItemsAutoDestroy; import org.l2jmobius.gameserver.ItemsAutoDestroy;
import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread;
import org.l2jmobius.gameserver.RecipeController;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.ai.PlayerAI; import org.l2jmobius.gameserver.ai.PlayerAI;
@@ -115,6 +114,7 @@ import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
import org.l2jmobius.gameserver.instancemanager.PunishmentManager; import org.l2jmobius.gameserver.instancemanager.PunishmentManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.SellBuffsManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.AccessLevel; import org.l2jmobius.gameserver.model.AccessLevel;
@@ -593,12 +593,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
private boolean _minimapAllowed = false; private boolean _minimapAllowed = false;
@@ -670,7 +670,7 @@ public final class PlayerInstance extends Playable
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -687,7 +687,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -710,7 +710,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private final Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -2005,11 +2005,7 @@ public final class PlayerInstance extends Playable
public int getWeightPenalty() public int getWeightPenalty()
{ {
if (_dietMode) return _dietMode ? 0 : _curWeightPenalty;
{
return 0;
}
return _curWeightPenalty;
} }
/** /**
@@ -4265,7 +4261,14 @@ public final class PlayerInstance extends Playable
if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL)) if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL))
{ {
sendPacket(new PrivateStoreListSell(this, targetPlayer)); if (_isSellingBuffs)
{
SellBuffsManager.getInstance().sendBuffMenu(this, targetPlayer, 0);
}
else
{
sendPacket(new PrivateStoreListSell(this, targetPlayer));
}
} }
else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY) else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY)
{ {
@@ -4983,13 +4986,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5410,7 +5413,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5461,16 +5464,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5488,16 +5481,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10359,14 +10342,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10466,12 +10446,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -10863,16 +10840,6 @@ public final class PlayerInstance extends Playable
LOGGER.log(Level.SEVERE, "deleteMe()", e); LOGGER.log(Level.SEVERE, "deleteMe()", e);
} }
// Stop crafting, if in progress
try
{
RecipeController.getInstance().requestMakeItemAbort(this);
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "deleteMe()", e);
}
// Cancel Attak or Cast // Cancel Attak or Cast
try try
{ {
@@ -11584,38 +11551,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11625,8 +11581,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11638,8 +11593,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11672,7 +11626,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13085,7 +13039,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13128,7 +13082,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13147,7 +13101,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13166,7 +13120,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13534,22 +13488,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13558,7 +13502,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13568,7 +13512,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13576,12 +13520,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13592,7 +13536,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13612,7 +13556,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13621,7 +13565,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13653,16 +13597,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13752,16 +13686,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13771,7 +13695,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13785,11 +13709,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13798,11 +13721,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13812,11 +13734,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -51,7 +51,6 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.GameTimeController; import org.l2jmobius.gameserver.GameTimeController;
import org.l2jmobius.gameserver.ItemsAutoDestroy; import org.l2jmobius.gameserver.ItemsAutoDestroy;
import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread;
import org.l2jmobius.gameserver.RecipeController;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.ai.PlayerAI; import org.l2jmobius.gameserver.ai.PlayerAI;
@@ -115,6 +114,7 @@ import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
import org.l2jmobius.gameserver.instancemanager.PunishmentManager; import org.l2jmobius.gameserver.instancemanager.PunishmentManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.SellBuffsManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.AccessLevel; import org.l2jmobius.gameserver.model.AccessLevel;
@@ -593,12 +593,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
private boolean _minimapAllowed = false; private boolean _minimapAllowed = false;
@@ -670,7 +670,7 @@ public final class PlayerInstance extends Playable
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -687,7 +687,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -710,7 +710,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private final Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -2005,11 +2005,7 @@ public final class PlayerInstance extends Playable
public int getWeightPenalty() public int getWeightPenalty()
{ {
if (_dietMode) return _dietMode ? 0 : _curWeightPenalty;
{
return 0;
}
return _curWeightPenalty;
} }
/** /**
@@ -4265,7 +4261,14 @@ public final class PlayerInstance extends Playable
if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL)) if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL))
{ {
sendPacket(new PrivateStoreListSell(this, targetPlayer)); if (_isSellingBuffs)
{
SellBuffsManager.getInstance().sendBuffMenu(this, targetPlayer, 0);
}
else
{
sendPacket(new PrivateStoreListSell(this, targetPlayer));
}
} }
else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY) else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY)
{ {
@@ -4983,13 +4986,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5410,7 +5413,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5461,16 +5464,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5488,16 +5481,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10359,14 +10342,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10466,12 +10446,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -10863,16 +10840,6 @@ public final class PlayerInstance extends Playable
LOGGER.log(Level.SEVERE, "deleteMe()", e); LOGGER.log(Level.SEVERE, "deleteMe()", e);
} }
// Stop crafting, if in progress
try
{
RecipeController.getInstance().requestMakeItemAbort(this);
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "deleteMe()", e);
}
// Cancel Attak or Cast // Cancel Attak or Cast
try try
{ {
@@ -11584,38 +11551,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11625,8 +11581,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11638,8 +11593,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11672,7 +11626,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13085,7 +13039,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13128,7 +13082,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13147,7 +13101,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13166,7 +13120,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13534,22 +13488,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13558,7 +13502,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13568,7 +13512,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13576,12 +13520,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13592,7 +13536,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13612,7 +13556,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13621,7 +13565,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13653,16 +13597,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13752,16 +13686,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13771,7 +13695,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13785,11 +13709,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13798,11 +13721,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13812,11 +13734,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -712,7 +712,7 @@ public final class EffectList
* @param info * @param info
* @param removed * @param removed
*/ */
private synchronized void removeActive(BuffInfo info, boolean removed) private void removeActive(BuffInfo info, boolean removed)
{ {
if (!_actives.isEmpty()) if (!_actives.isEmpty())
{ {
@@ -790,7 +790,7 @@ public final class EffectList
updateEffectList(true); updateEffectList(true);
} }
private synchronized void addActive(BuffInfo info) private void addActive(BuffInfo info)
{ {
final Skill skill = info.getSkill(); final Skill skill = info.getSkill();
@@ -51,7 +51,6 @@ import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.GameTimeController; import org.l2jmobius.gameserver.GameTimeController;
import org.l2jmobius.gameserver.ItemsAutoDestroy; import org.l2jmobius.gameserver.ItemsAutoDestroy;
import org.l2jmobius.gameserver.LoginServerThread; import org.l2jmobius.gameserver.LoginServerThread;
import org.l2jmobius.gameserver.RecipeController;
import org.l2jmobius.gameserver.ai.CreatureAI; import org.l2jmobius.gameserver.ai.CreatureAI;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.ai.PlayerAI; import org.l2jmobius.gameserver.ai.PlayerAI;
@@ -115,6 +114,7 @@ import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager; import org.l2jmobius.gameserver.instancemanager.MentorManager;
import org.l2jmobius.gameserver.instancemanager.PunishmentManager; import org.l2jmobius.gameserver.instancemanager.PunishmentManager;
import org.l2jmobius.gameserver.instancemanager.QuestManager; import org.l2jmobius.gameserver.instancemanager.QuestManager;
import org.l2jmobius.gameserver.instancemanager.SellBuffsManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager; import org.l2jmobius.gameserver.instancemanager.SiegeManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.AccessLevel; import org.l2jmobius.gameserver.model.AccessLevel;
@@ -593,12 +593,12 @@ public final class PlayerInstance extends Playable
/** The Pet of the PlayerInstance */ /** The Pet of the PlayerInstance */
private PetInstance _pet = null; private PetInstance _pet = null;
/** Servitors of the PlayerInstance */ /** Servitors of the PlayerInstance */
private volatile Map<Integer, Summon> _servitors = null; private volatile Map<Integer, Summon> _servitors = new ConcurrentHashMap<>(1);
/** The Agathion of the PlayerInstance */ /** The Agathion of the PlayerInstance */
private int _agathionId = 0; private int _agathionId = 0;
// apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!! // apparently, a PlayerInstance CAN have both a summon AND a tamed beast at the same time!!
// after Freya players can control more than one tamed beast // after Freya players can control more than one tamed beast
private volatile Set<TamedBeastInstance> _tamedBeast = null; private volatile Set<TamedBeastInstance> _tamedBeast = ConcurrentHashMap.newKeySet();
private boolean _minimapAllowed = false; private boolean _minimapAllowed = false;
@@ -670,7 +670,7 @@ public final class PlayerInstance extends Playable
private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos; private volatile Map<Integer, ExResponseCommissionInfo> _lastCommissionInfos;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events; private volatile Map<Class<? extends AbstractEvent>, AbstractEvent<?>> _events = new ConcurrentHashMap<>();
private boolean _isOnCustomEvent = false; private boolean _isOnCustomEvent = false;
// protects a char from aggro mobs when getting up from fake death // protects a char from aggro mobs when getting up from fake death
@@ -687,7 +687,7 @@ public final class PlayerInstance extends Playable
private int _expertiseWeaponPenalty = 0; private int _expertiseWeaponPenalty = 0;
private int _expertisePenaltyBonus = 0; private int _expertisePenaltyBonus = 0;
private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests; private volatile Map<Class<? extends AbstractRequest>, AbstractRequest> _requests = new ConcurrentHashMap<>();
protected boolean _inventoryDisable = false; protected boolean _inventoryDisable = false;
/** Player's cubics. */ /** Player's cubics. */
@@ -710,7 +710,7 @@ public final class PlayerInstance extends Playable
private final BlockList _blockList = new BlockList(this); private final BlockList _blockList = new BlockList(this);
private volatile Map<Integer, Skill> _transformSkills; private final Map<Integer, Skill> _transformSkills = new ConcurrentHashMap<>();
private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskRentPet;
private ScheduledFuture<?> _taskWater; private ScheduledFuture<?> _taskWater;
@@ -2005,11 +2005,7 @@ public final class PlayerInstance extends Playable
public int getWeightPenalty() public int getWeightPenalty()
{ {
if (_dietMode) return _dietMode ? 0 : _curWeightPenalty;
{
return 0;
}
return _curWeightPenalty;
} }
/** /**
@@ -4265,7 +4261,14 @@ public final class PlayerInstance extends Playable
if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL)) if ((targetPlayer.getPrivateStoreType() == PrivateStoreType.SELL) || (targetPlayer.getPrivateStoreType() == PrivateStoreType.PACKAGE_SELL))
{ {
sendPacket(new PrivateStoreListSell(this, targetPlayer)); if (_isSellingBuffs)
{
SellBuffsManager.getInstance().sendBuffMenu(this, targetPlayer, 0);
}
else
{
sendPacket(new PrivateStoreListSell(this, targetPlayer));
}
} }
else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY) else if (targetPlayer.getPrivateStoreType() == PrivateStoreType.BUY)
{ {
@@ -4983,13 +4986,13 @@ public final class PlayerInstance extends Playable
{ {
stopFeed(); stopFeed();
} }
synchronized (this) // synchronized (this)
// {
if (isFakeDeath())
{ {
if (isFakeDeath()) stopFakeDeath(true);
{
stopFakeDeath(true);
}
} }
// }
// Unsummon Cubics // Unsummon Cubics
if (!_cubics.isEmpty()) if (!_cubics.isEmpty())
@@ -5410,7 +5413,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public Map<Integer, Summon> getServitors() public Map<Integer, Summon> getServitors()
{ {
return _servitors == null ? Collections.emptyMap() : _servitors; return _servitors;
} }
public Summon getAnyServitor() public Summon getAnyServitor()
@@ -5461,16 +5464,6 @@ public final class PlayerInstance extends Playable
public void addServitor(Summon servitor) public void addServitor(Summon servitor)
{ {
if (_servitors == null)
{
synchronized (this)
{
if (_servitors == null)
{
_servitors = new ConcurrentHashMap<>(1);
}
}
}
_servitors.put(servitor.getObjectId(), servitor); _servitors.put(servitor.getObjectId(), servitor);
} }
@@ -5488,16 +5481,6 @@ public final class PlayerInstance extends Playable
*/ */
public void addTrainedBeast(TamedBeastInstance tamedBeast) public void addTrainedBeast(TamedBeastInstance tamedBeast)
{ {
if (_tamedBeast == null)
{
synchronized (this)
{
if (_tamedBeast == null)
{
_tamedBeast = ConcurrentHashMap.newKeySet();
}
}
}
_tamedBeast.add(tamedBeast); _tamedBeast.add(tamedBeast);
} }
@@ -10359,14 +10342,11 @@ public final class PlayerInstance extends Playable
} }
// Trained beast is lost after teleport // Trained beast is lost after teleport
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.deleteMe();
{
tamedBeast.deleteMe();
}
_tamedBeast.clear();
} }
_tamedBeast.clear();
// Modify the position of the pet if necessary // Modify the position of the pet if necessary
if (_pet != null) if (_pet != null)
@@ -10466,12 +10446,9 @@ public final class PlayerInstance extends Playable
super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect); super.reduceCurrentHp(value, attacker, skill, isDOT, directlyToHp, critical, reflect);
// notify the tamed beast of attacks // notify the tamed beast of attacks
if (_tamedBeast != null) for (TamedBeastInstance tamedBeast : _tamedBeast)
{ {
for (TamedBeastInstance tamedBeast : _tamedBeast) tamedBeast.onOwnerGotAttacked(attacker);
{
tamedBeast.onOwnerGotAttacked(attacker);
}
} }
} }
@@ -10863,16 +10840,6 @@ public final class PlayerInstance extends Playable
LOGGER.log(Level.SEVERE, "deleteMe()", e); LOGGER.log(Level.SEVERE, "deleteMe()", e);
} }
// Stop crafting, if in progress
try
{
RecipeController.getInstance().requestMakeItemAbort(this);
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "deleteMe()", e);
}
// Cancel Attak or Cast // Cancel Attak or Cast
try try
{ {
@@ -11584,38 +11551,27 @@ public final class PlayerInstance extends Playable
public void addTransformSkill(Skill skill) public void addTransformSkill(Skill skill)
{ {
if (_transformSkills == null)
{
synchronized (this)
{
if (_transformSkills == null)
{
_transformSkills = new HashMap<>();
}
}
}
_transformSkills.put(skill.getId(), skill); _transformSkills.put(skill.getId(), skill);
} }
public boolean hasTransformSkill(Skill skill) public boolean hasTransformSkill(Skill skill)
{ {
return (_transformSkills != null) && (_transformSkills.get(skill.getId()) == skill); return !_transformSkills.isEmpty() && (_transformSkills.get(skill.getId()) == skill);
} }
public boolean hasTransformSkills() public boolean hasTransformSkills()
{ {
return (_transformSkills != null); return !_transformSkills.isEmpty();
} }
public Collection<Skill> getAllTransformSkills() public Collection<Skill> getAllTransformSkills()
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return _transformSkills.values();
return transformSkills != null ? transformSkills.values() : Collections.emptyList();
} }
public synchronized void removeAllTransformSkills() public void removeAllTransformSkills()
{ {
_transformSkills = null; _transformSkills.clear();
} }
/** /**
@@ -11625,8 +11581,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public final Skill getKnownSkill(int skillId) public final Skill getKnownSkill(int skillId)
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; return !_transformSkills.isEmpty() ? _transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
return transformSkills != null ? transformSkills.getOrDefault(skillId, super.getKnownSkill(skillId)) : super.getKnownSkill(skillId);
} }
/** /**
@@ -11638,8 +11593,7 @@ public final class PlayerInstance extends Playable
if (isTransformed()) if (isTransformed())
{ {
final Map<Integer, Skill> transformSkills = _transformSkills; if (!_transformSkills.isEmpty())
if (transformSkills != null)
{ {
// Include transformation skills and those skills that are allowed during transformation. // Include transformation skills and those skills that are allowed during transformation.
currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList()); currentSkills = currentSkills.stream().filter(Skill::allowOnTransform).collect(Collectors.toList());
@@ -11672,7 +11626,7 @@ public final class PlayerInstance extends Playable
} }
} }
// Include transformation skills. // Include transformation skills.
currentSkills.addAll(transformSkills.values()); currentSkills.addAll(_transformSkills.values());
} }
} }
@@ -13085,7 +13039,7 @@ public final class PlayerInstance extends Playable
@Override @Override
public boolean canRevive() public boolean canRevive()
{ {
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13128,7 +13082,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13147,7 +13101,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13166,7 +13120,7 @@ public final class PlayerInstance extends Playable
{ {
return true; return true;
} }
if (_events != null) if (!_events.isEmpty())
{ {
for (AbstractEvent<?> listener : _events.values()) for (AbstractEvent<?> listener : _events.values())
{ {
@@ -13534,22 +13488,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean addRequest(AbstractRequest request) public boolean addRequest(AbstractRequest request)
{ {
if (_requests == null)
{
synchronized (this)
{
if (_requests == null)
{
_requests = new ConcurrentHashMap<>();
}
}
}
return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null); return canRequest(request) && (_requests.putIfAbsent(request.getClass(), request) == null);
} }
public boolean canRequest(AbstractRequest request) public boolean canRequest(AbstractRequest request)
{ {
return (_requests != null) && _requests.values().stream().allMatch(request::canWorkWith); return !_requests.isEmpty() && _requests.values().stream().allMatch(request::canWorkWith);
} }
/** /**
@@ -13558,7 +13502,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeRequest(Class<? extends AbstractRequest> clazz) public boolean removeRequest(Class<? extends AbstractRequest> clazz)
{ {
return (_requests != null) && (_requests.remove(clazz) != null); return !_requests.isEmpty() && (_requests.remove(clazz) != null);
} }
/** /**
@@ -13568,7 +13512,7 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractRequest> T getRequest(Class<T> requestClass) public <T extends AbstractRequest> T getRequest(Class<T> requestClass)
{ {
return _requests != null ? requestClass.cast(_requests.get(requestClass)) : null; return !_requests.isEmpty() ? requestClass.cast(_requests.get(requestClass)) : null;
} }
/** /**
@@ -13576,12 +13520,12 @@ public final class PlayerInstance extends Playable
*/ */
public boolean hasRequests() public boolean hasRequests()
{ {
return (_requests != null) && !_requests.isEmpty(); return !_requests.isEmpty();
} }
public boolean hasItemRequest() public boolean hasItemRequest()
{ {
return (_requests != null) && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest); return !_requests.isEmpty() && _requests.values().stream().anyMatch(AbstractRequest::isItemRequest);
} }
/** /**
@@ -13592,7 +13536,7 @@ public final class PlayerInstance extends Playable
@SafeVarargs @SafeVarargs
public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes) public final boolean hasRequest(Class<? extends AbstractRequest> requestClass, Class<? extends AbstractRequest>... classes)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
for (Class<? extends AbstractRequest> clazz : classes) for (Class<? extends AbstractRequest> clazz : classes)
{ {
@@ -13612,7 +13556,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isProcessingItem(int objectId) public boolean isProcessingItem(int objectId)
{ {
return (_requests != null) && _requests.values().stream().anyMatch(req -> req.isUsing(objectId)); return !_requests.isEmpty() && _requests.values().stream().anyMatch(req -> req.isUsing(objectId));
} }
/** /**
@@ -13621,7 +13565,7 @@ public final class PlayerInstance extends Playable
*/ */
public void removeRequestsThatProcessesItem(int objectId) public void removeRequestsThatProcessesItem(int objectId)
{ {
if (_requests != null) if (!_requests.isEmpty())
{ {
_requests.values().removeIf(req -> req.isUsing(objectId)); _requests.values().removeIf(req -> req.isUsing(objectId));
} }
@@ -13653,16 +13597,6 @@ public final class PlayerInstance extends Playable
*/ */
public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos() public Map<Integer, ExResponseCommissionInfo> getLastCommissionInfos()
{ {
if (_lastCommissionInfos == null)
{
synchronized (this)
{
if (_lastCommissionInfos == null)
{
_lastCommissionInfos = new ConcurrentHashMap<>();
}
}
}
return _lastCommissionInfos; return _lastCommissionInfos;
} }
@@ -13752,16 +13686,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean registerOnEvent(AbstractEvent<?> event) public boolean registerOnEvent(AbstractEvent<?> event)
{ {
if (_events == null)
{
synchronized (this)
{
if (_events == null)
{
_events = new ConcurrentHashMap<>();
}
}
}
return _events.putIfAbsent(event.getClass(), event) == null; return _events.putIfAbsent(event.getClass(), event) == null;
} }
@@ -13771,7 +13695,7 @@ public final class PlayerInstance extends Playable
*/ */
public boolean removeFromEvent(AbstractEvent<?> event) public boolean removeFromEvent(AbstractEvent<?> event)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return false; return false;
} }
@@ -13785,11 +13709,10 @@ public final class PlayerInstance extends Playable
*/ */
public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz) public <T extends AbstractEvent<?>> T getEvent(Class<T> clazz)
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null); return _events.values().stream().filter(event -> clazz.isAssignableFrom(event.getClass())).map(clazz::cast).findFirst().orElse(null);
} }
@@ -13798,11 +13721,10 @@ public final class PlayerInstance extends Playable
*/ */
public AbstractEvent<?> getEvent() public AbstractEvent<?> getEvent()
{ {
if (_events == null) if (_events.isEmpty())
{ {
return null; return null;
} }
return _events.values().stream().findFirst().orElse(null); return _events.values().stream().findFirst().orElse(null);
} }
@@ -13812,11 +13734,6 @@ public final class PlayerInstance extends Playable
*/ */
public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz) public boolean isOnEvent(Class<? extends AbstractEvent<?>> clazz)
{ {
if (_events == null)
{
return false;
}
return _events.containsKey(clazz); return _events.containsKey(clazz);
} }
@@ -178,7 +178,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
} }
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }
@@ -311,7 +311,7 @@ public final class TamedBeastInstance extends FeedableBeastInstance
stopHpMpRegeneration(); stopHpMpRegeneration();
// clean up variables // clean up variables
if ((_owner != null) && (_owner.getTrainedBeasts() != null)) if (_owner != null)
{ {
_owner.getTrainedBeasts().remove(this); _owner.getTrainedBeasts().remove(this);
} }