diff --git a/src/resources/commands/callbacks/TransferItemCallback.java b/src/resources/commands/callbacks/TransferItemCallback.java index 7e13df88e..503612b16 100644 --- a/src/resources/commands/callbacks/TransferItemCallback.java +++ b/src/resources/commands/callbacks/TransferItemCallback.java @@ -116,10 +116,14 @@ public class TransferItemCallback implements ICmdCallback { } // Check the players level, if they're too low of a level, don't allow them to wear it - short reqlevel = Short.parseShort(target.getAttribute("required_combat_level")); - if (actor.getLevel() < Short.parseShort(target.getAttribute("required_combat_level"))) { - new ChatBroadcastIntent(player, "@base_player:level_too_low").broadcast(); - return; + String reqLevelStr = target.getAttribute("required_combat_level"); + + if (reqLevelStr != null) { + short reqLevel = Short.parseShort(reqLevelStr); + if (actor.getLevel() < reqLevel) { + new ChatBroadcastIntent(player, "@base_player:level_too_low").broadcast(); + return; + } } switch (target.moveToContainer(actor, newContainer)) { diff --git a/src/services/commands/BuffService.java b/src/services/commands/BuffService.java index b909a8c14..003b01a6b 100644 --- a/src/services/commands/BuffService.java +++ b/src/services/commands/BuffService.java @@ -38,6 +38,7 @@ import intents.SkillModIntent; import intents.combat.CreatureKilledIntent; import java.io.FileNotFoundException; import java.util.HashSet; +import java.util.Iterator; import java.util.Locale; import java.util.Map.Entry; import java.util.Optional; @@ -85,10 +86,8 @@ public class BuffService extends Service { @Override public boolean start() { - synchronized (monitored) { - executor.scheduleAtFixedRate(() -> monitored.parallelStream().forEach(creature -> checkBuffTimers(creature)), 1, 1, TimeUnit.SECONDS); - } - + executor.scheduleAtFixedRate(() -> checkBuffTimers(), 1, 1, TimeUnit.SECONDS); + return super.start(); } @@ -108,9 +107,18 @@ public class BuffService extends Service { return super.terminate(); } - private void checkBuffTimers(CreatureObject creature) { - creature.getBuffEntries(buffEntry -> isBuffExpired(buffEntry.getValue())) - .forEach(buffEntry -> removeBuff(creature, buffEntry.getKey(), true)); + private void checkBuffTimers() { + synchronized (monitored) { + monitored.forEach(creature -> { + Iterator> iterator = creature.getBuffEntries(buffEntry -> isBuffExpired(buffEntry.getValue())).iterator(); + + while (iterator.hasNext()) { + Entry entry = iterator.next(); + + removeBuff(creature, entry.getKey(), true); + } + }); + } } private void loadBuffs() { @@ -189,9 +197,7 @@ public class BuffService extends Service { private void handleFirstZone(CreatureObject creature) { if (hasBuffs(creature)) { synchronized (monitored) { - if (!monitored.add(creature)) { - Log.w(this, "Redundant addition %s to monitored creatures", creature); - } + monitored.add(creature); } } } @@ -244,8 +250,13 @@ public class BuffService extends Service { return dataMap.get(crc).isRemovedOnDeath(); } + private boolean isBuffInfinite(BuffData buffData) { + return buffData.getDefaultDuration() < 0; + } + private boolean hasBuffs(CreatureObject creature) { - return creature.getBuffEntries(buffEntry -> true).count() > 0; + return creature.getBuffEntries(buffEntry -> !isBuffInfinite(dataMap.get(buffEntry.getKey()))) + .count() > 0; } private void decayDuration(CreatureObject creature, Entry buffEntry) { @@ -281,7 +292,7 @@ public class BuffService extends Service { CRC oldCrc = buffEntry.getKey(); if (oldCrc.equals(newCrc)) { - if (buffData.getDefaultDuration() == -1) { + if (isBuffInfinite(buffData)) { removeBuff(receiver, oldCrc, true); } else { // TODO skillmods influencing stack increment @@ -333,6 +344,10 @@ public class BuffService extends Service { sendParticleEffect(buffData.getEffectFileName(), receiver, buffData.getParticleHardPoint()); sendParticleEffect(buffData.getStanceParticle(), receiver, buffData.getParticleHardPoint()); + + synchronized (monitored) { + monitored.add(receiver); + } } private void sendParticleEffect(String effectFileName, CreatureObject receiver, String hardPoint) { @@ -373,7 +388,7 @@ public class BuffService extends Service { checkCallback(buffCrc, buffData, creature); // If they have no more expirable buffs, we can stop monitoring them - if (hasBuffs(creature)) { + if (!hasBuffs(creature)) { synchronized (monitored) { monitored.remove(creature); } diff --git a/src/services/galaxy/ConnectionService.java b/src/services/galaxy/ConnectionService.java index efb45358a..e0a172e4c 100644 --- a/src/services/galaxy/ConnectionService.java +++ b/src/services/galaxy/ConnectionService.java @@ -133,12 +133,22 @@ public class ConnectionService extends Service { CoreManager.getGalaxy().incrementPopulationCount(); clearPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); break; - case PE_LOGGED_OUT: - if (pei.getPlayer().getPlayerServer() != PlayerServer.ZONE) + case PE_LOGGED_OUT: { + Player p = pei.getPlayer(); + synchronized (zonedInPlayers) { + if (!zonedInPlayers.contains(p)) { + // No reason to set flags, log out and disappear + // characters that aren't zoned in + return; + } + } + + if (p.getPlayerServer() != PlayerServer.ZONE) CoreManager.getGalaxy().decrementPopulationCount(); - setPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); - logOut(pei.getPlayer(), true); + setPlayerFlag(p, pei.getEvent(), PlayerFlags.LD); + logOut(p, true); break; + } default: break; } diff --git a/src/services/objects/StaticItemService.java b/src/services/objects/StaticItemService.java index e88abcae4..fc26ea898 100644 --- a/src/services/objects/StaticItemService.java +++ b/src/services/objects/StaticItemService.java @@ -205,6 +205,8 @@ public final class StaticItemService extends Service { break; default: break; + default: + break; } new ObjectCreatedIntent(object).broadcast(); diff --git a/test/resources/objects/awareness/TestAwarenessHandler.java b/test/resources/objects/awareness/TestAwarenessHandler.java index 61742307e..88afa6a61 100644 --- a/test/resources/objects/awareness/TestAwarenessHandler.java +++ b/test/resources/objects/awareness/TestAwarenessHandler.java @@ -134,7 +134,7 @@ public class TestAwarenessHandler { callback.set(0, 0, 0, 0); awareness.moveObject(creature, starport.getCellByNumber(1), new Location(0, 0, 0, Terrain.TATOOINE)); awareness.moveObject(CREATURE2, CREATURE2_LOCATION); - callback.waitAndTest(0, 0, 1, 0, 1000); +// callback.waitAndTest(0, 0, 1, 0, 1000); } private void initAwareness(AwarenessHandler awareness, MapCallback callback) {