From d86b65da9b94d4751b1a0d24f5f7cf2692875ecb Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Sun, 30 Aug 2020 19:26:33 +0000 Subject: [PATCH] Removed enhanced For from World and WorldRegion. --- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../gameserver/handler/ISkillHandler.java | 4 +- .../handler/skillhandlers/Disablers.java | 17 +- .../org/l2jmobius/gameserver/model/World.java | 134 +-- .../gameserver/model/WorldRegion.java | 103 +- .../gameserver/model/actor/Creature.java | 892 +++++++++--------- .../actor/knownlist/WorldObjectKnownList.java | 6 +- .../gameserver/model/items/Weapon.java | 53 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../gameserver/handler/ISkillHandler.java | 4 +- .../handler/skillhandlers/Disablers.java | 17 +- .../org/l2jmobius/gameserver/model/World.java | 134 +-- .../gameserver/model/WorldRegion.java | 103 +- .../gameserver/model/actor/Creature.java | 892 +++++++++--------- .../actor/knownlist/WorldObjectKnownList.java | 6 +- .../gameserver/model/items/Weapon.java | 53 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 61 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 61 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- .../.settings/org.eclipse.jdt.ui.prefs | 11 +- .../org/l2jmobius/gameserver/model/World.java | 59 +- .../gameserver/model/WorldRegion.java | 55 +- 67 files changed, 2640 insertions(+), 1929 deletions(-) diff --git a/L2J_Mobius_1.0_Ertheia/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_1.0_Ertheia/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_1.0_Ertheia/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_1.0_Ertheia/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_2.5_Underground/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_2.5_Underground/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_2.5_Underground/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_2.5_Underground/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_3.0_Helios/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_3.0_Helios/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_3.0_Helios/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_3.0_Helios/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_4.0_GrandCrusade/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_4.0_GrandCrusade/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_4.0_GrandCrusade/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_4.0_GrandCrusade/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_5.0_Salvation/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_5.0_Salvation/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_5.0_Salvation/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_5.0_Salvation/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_5.5_EtinasFate/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_5.5_EtinasFate/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_5.5_EtinasFate/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_5.5_EtinasFate/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_6.0_Fafurion/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_6.0_Fafurion/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_6.0_Fafurion/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_6.0_Fafurion/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_C1_HarbingersOfWar/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_C1_HarbingersOfWar/.settings/org.eclipse.jdt.ui.prefs index 832cb4a571..5a7cb83538 100644 --- a/L2J_Mobius_C1_HarbingersOfWar/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_C1_HarbingersOfWar/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_C4_ScionsOfDestiny/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_C4_ScionsOfDestiny/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_C4_ScionsOfDestiny/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/handler/ISkillHandler.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/handler/ISkillHandler.java index 037b03a3a4..19f055b182 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/handler/ISkillHandler.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/handler/ISkillHandler.java @@ -16,7 +16,6 @@ */ package org.l2jmobius.gameserver.handler; -import java.io.IOException; import java.util.List; import org.l2jmobius.gameserver.model.Skill; @@ -30,9 +29,8 @@ public interface ISkillHandler * @param creature * @param skill * @param targets - * @throws IOException */ - void useSkill(Creature creature, Skill skill, List targets) throws IOException; + void useSkill(Creature creature, Skill skill, List targets); /** * this method is called at initialization to register all the item ids automatically diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/handler/skillhandlers/Disablers.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/handler/skillhandlers/Disablers.java index 0eabe67723..83686887f0 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/handler/skillhandlers/Disablers.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/handler/skillhandlers/Disablers.java @@ -16,7 +16,6 @@ */ package org.l2jmobius.gameserver.handler.skillhandlers; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; @@ -675,14 +674,14 @@ public class Disablers implements ISkillHandler final List tgts = new ArrayList<>(); tgts.add(target); - try - { - healhandler.useSkill(creature, skill, tgts); - } - catch (IOException e) - { - LOGGER.warning(e.getMessage()); - } + // try + // { + healhandler.useSkill(creature, skill, tgts); + // } + // catch (IOException e) + // { + // LOGGER.warning(e.getMessage()); + // } } } for (String stat : negateEffectTypes) diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/World.java index 7e7e20b8ba..1c40f10b4b 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/World.java @@ -115,21 +115,9 @@ public class World */ public void removeObjects(List list) { - for (WorldObject o : list) + for (int i = 0; i < list.size(); i++) { - _allObjects.remove(o.getObjectId()); - } - } - - /** - * Removes the objects. - * @param objects the objects - */ - public void removeObjects(WorldObject[] objects) - { - for (WorldObject o : objects) - { - _allObjects.remove(o.getObjectId()); + _allObjects.remove(list.get(i).getObjectId()); } } @@ -138,12 +126,12 @@ public class World *
* Example of use:
*
  • Client packets : Action, AttackRequest, RequestJoinParty, RequestJoinPledge...

  • - * @param oID Identifier of the WorldObject + * @param objectId Identifier of the WorldObject * @return the object */ - public WorldObject findObject(int oID) + public WorldObject findObject(int objectId) { - return _allObjects.get(oID); + return _allObjects.get(objectId); } /** @@ -308,12 +296,10 @@ public class World } // Go through the visible objects contained in the circular area - for (WorldObject wo : getVisibleObjects(object, 2000)) + final List visibleObjects = getVisibleObjects(object, 2000); + for (int i = 0; i < visibleObjects.size(); i++) { - if (wo == null) - { - continue; - } + final WorldObject wo = visibleObjects.get(i); // Add the object in WorldObjectHashSet(WorldObject) _knownObjects of the visible Creature according to conditions : // - Creature is visible @@ -342,8 +328,11 @@ public class World } // Go through the visible objects contained in the circular area - for (WorldObject wo : getVisibleObjects(object, 2000)) + final List visibleObjects = getVisibleObjects(object, 2000); + for (int i = 0; i < visibleObjects.size(); i++) { + final WorldObject wo = visibleObjects.get(i); + // Add the object in WorldObjectHashSet(WorldObject) _knownObjects of the visible Creature according to conditions : // - Creature is visible // - object is not already known @@ -417,10 +406,14 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); + // Remove the WorldObject from the WorldObjectHashSet(WorldObject) _knownObjects of the surrounding WorldRegion Creatures // If object is a PlayerInstance, remove the WorldObject from the WorldObjectHashSet(PlayerInstance) _knownPlayer of the surrounding WorldRegion Creatures // If object is targeted by one of the surrounding WorldRegion Creatures, cancel ATTACK and cast @@ -489,10 +482,13 @@ public class World final List result = new ArrayList<>(); // Go through the list of region - for (WorldRegion worldRegion : region.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = region.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == null) { continue; @@ -552,11 +548,14 @@ public class World final List result = new ArrayList<>(); // Go through the list of region - for (WorldRegion worldRegion : region.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = region.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { // Go through visible objects of the selected region - for (WorldObject wo : worldRegion.getVisibleObjects()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == null) { continue; @@ -614,10 +613,13 @@ public class World final List result = new ArrayList<>(); // Go through visible object of the selected region - for (WorldRegion worldRegion : object.getWorldRegion().getSurroundingRegions()) + final WorldRegion[] surroundingRegions = object.getWorldRegion().getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == null) { continue; @@ -644,58 +646,6 @@ public class World return result; } - /** - * Return all visible players of the WorldRegion object's and of its surrounding WorldRegion.
    - *
    - * Concept:
    - *
    - * All visible object are identified in _visibleObjects of their current WorldRegion
    - * All surrounding WorldRegion are identified in _surroundingRegions of the selected WorldRegion in order to scan a large area around a WorldObject
    - *
    - * Example of use:
    - *
  • Find Close Objects for Creature

  • - * @param object WorldObject that determine the current WorldRegion - * @return the visible playable - */ - public List getVisiblePlayers(WorldObject object) - { - final WorldRegion region = object.getWorldRegion(); - if (region == null) - { - return Collections.emptyList(); - } - - // Create a list in order to contain all visible WorldObject - final List result = new ArrayList<>(); - - // Go through the list of region - for (WorldRegion worldRegion : region.getSurroundingRegions()) - { - // Go through visible object of the selected region - for (PlayerInstance playable : worldRegion.getAllPlayers()) - { - if (playable == null) - { - continue; - } - - if (playable.equals(object)) - { - continue; // skip our own character - } - - if (!playable.isSpawned()) - { - continue; // skip dying objects - } - - result.add(playable); - } - } - - return result; - } - /** * Calculate the current WorldRegions of the object according to its position (x,y).
    *
    @@ -793,24 +743,6 @@ public class World LOGGER.info("All visible NPCs deleted."); } - /** - * Gets the account players. - * @param account the account_name - * @return the account players - */ - public List getAccountPlayers(String account) - { - final List result = new ArrayList<>(); - for (PlayerInstance actual : _allPlayers.values()) - { - if (actual.getAccountName().equals(account)) - { - result.add(actual); - } - } - return result; - } - public static World getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/WorldRegion.java index fbcc836ef0..36d0b686ac 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,10 +16,9 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Collection; +import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import java.util.logging.Logger; @@ -31,9 +30,7 @@ import org.l2jmobius.gameserver.ai.SiegeGuardAI; import org.l2jmobius.gameserver.datatables.sql.SpawnTable; import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Creature; -import org.l2jmobius.gameserver.model.actor.Playable; import org.l2jmobius.gameserver.model.actor.instance.NpcInstance; -import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.spawn.Spawn; import org.l2jmobius.gameserver.model.zone.ZoneManager; import org.l2jmobius.gameserver.model.zone.ZoneType; @@ -44,8 +41,7 @@ public class WorldRegion { private static final Logger LOGGER = Logger.getLogger(WorldRegion.class.getName()); - private final Collection _playerObjects = ConcurrentHashMap.newKeySet(); - private final Collection _visibleObjects = ConcurrentHashMap.newKeySet(); + private final List _visibleObjects = new ArrayList<>(); private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -74,7 +70,6 @@ public class WorldRegion { return; } - _zoneManager.unregisterZone(zone); } @@ -127,8 +122,9 @@ public class WorldRegion { if (!isOn) { - for (WorldObject wo : _visibleObjects) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo instanceof Attackable) { final Attackable mob = (Attackable) wo; @@ -174,8 +170,9 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo instanceof Attackable) { // Start HP/MP/CP Regeneration task @@ -190,20 +187,28 @@ public class WorldRegion } } - public Boolean isActive() + public boolean isActive() { return _active; } // check if all 9 neighbors (including self) are inactive or active but with no players. // returns true if the above condition is met. - public Boolean areNeighborsEmpty() + public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && !worldRegion.getAllPlayers().isEmpty()) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -246,9 +251,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -272,8 +277,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -296,18 +302,19 @@ public class WorldRegion return; } - _visibleObjects.add(object); - - if (object instanceof PlayerInstance) + synchronized (_visibleObjects) { - _playerObjects.add((PlayerInstance) object); - - // if this is the first player to enter the region, activate self & neighbors - if ((_playerObjects.size() == 1) && !Config.GRIDS_ALWAYS_ON) + if (!_visibleObjects.contains(object)) { - startActivation(); + _visibleObjects.add(object); } } + + // If this is the first player to enter the region, activate self and neighbors. + if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) + { + startActivation(); + } } /** @@ -323,22 +330,36 @@ public class WorldRegion return; } - _visibleObjects.remove(object); - - if (object instanceof Playable) + if (_visibleObjects.isEmpty()) { - _playerObjects.remove(object); - - if (_playerObjects.isEmpty() && !Config.GRIDS_ALWAYS_ON) - { - startDeactivation(); - } + return; + } + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } + + if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) + { + startDeactivation(); } } public void setSurroundingRegions(WorldRegion[] regions) { _surroundingRegions = regions; + + // Make sure that this region is always the first region to improve bulk operations when this region should be updated first. + for (int i = 0; i < _surroundingRegions.length; i++) + { + if (_surroundingRegions[i] == this) + { + final WorldRegion first = _surroundingRegions[0]; + _surroundingRegions[0] = this; + _surroundingRegions[i] = first; + } + } } /** @@ -349,12 +370,7 @@ public class WorldRegion return _surroundingRegions; } - public Collection getAllPlayers() - { - return _playerObjects; - } - - public Collection getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } @@ -370,8 +386,9 @@ public class WorldRegion public synchronized void deleteVisibleNpcSpawns() { LOGGER.info("Deleting all visible NPCs in Region: " + getName()); - for (WorldObject obj : _visibleObjects) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject obj = _visibleObjects.get(i); if (obj instanceof NpcInstance) { final NpcInstance target = (NpcInstance) obj; @@ -404,8 +421,10 @@ public class WorldRegion final int down = y - range; final int left = x + range; final int right = x - range; - for (ZoneType e : _zoneManager.getZones()) + final List zones = _zoneManager.getZones(); + for (int i = 0; i < zones.size(); i++) { + final ZoneType e = zones.get(i); if (e instanceof PeaceZone) { if (e.isInsideZone(x, up, z)) diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/actor/Creature.java index 1afef16c25..2322209fb0 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/actor/Creature.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/actor/Creature.java @@ -2751,17 +2751,17 @@ public abstract class Creature extends WorldObject implements ISkillsHolder @Override public void run() { - try + // try + // { + if (_creature != null) { - if (_creature != null) - { - _creature.enableSkill(_skill); - } - } - catch (Throwable e) - { - LOGGER.warning(e.getMessage()); + _creature.enableSkill(_skill); } + // } + // catch (Throwable e) + // { + // LOGGER.warning(e.getMessage()); + // } } } @@ -2805,14 +2805,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder @Override public void run() { - try - { - onHitTimer(_hitTarget, _damage, _crit, _miss, _soulshot, _shld); - } - catch (Throwable e) - { - LOGGER.warning("fixme:hit task unhandled exception " + e); - } + // try + // { + onHitTimer(_hitTarget, _damage, _crit, _miss, _soulshot, _shld); + // } + // catch (Throwable e) + // { + // LOGGER.warning("fixme:hit task unhandled exception " + e); + // } } } @@ -2905,14 +2905,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder @Override public void run() { - try - { - _currPlayer.useMagic(_queuedSkill, _isCtrlPressed, _isShiftPressed); - } - catch (Throwable e) - { - LOGGER.warning(e.getMessage()); - } + // try + // { + _currPlayer.useMagic(_queuedSkill, _isCtrlPressed, _isShiftPressed); + // } + // catch (Throwable e) + // { + // LOGGER.warning(e.getMessage()); + // } } } @@ -2935,14 +2935,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder @Override public void run() { - try - { - getAI().notifyEvent(_evt, null); - } - catch (Throwable t) - { - LOGGER.warning(t.getMessage()); - } + // try + // { + getAI().notifyEvent(_evt, null); + // } + // catch (Throwable t) + // { + // LOGGER.warning(t.getMessage()); + // } } } @@ -2954,25 +2954,25 @@ public abstract class Creature extends WorldObject implements ISkillsHolder @Override public void run() { - try + // try + // { + if (System.currentTimeMillis() > _pvpFlagLasts) { - if (System.currentTimeMillis() > _pvpFlagLasts) - { - stopPvPFlag(); - } - else if (System.currentTimeMillis() > (_pvpFlagLasts - 5000)) - { - updatePvPFlag(2); - } - else - { - updatePvPFlag(1); - } + stopPvPFlag(); } - catch (Exception e) + else if (System.currentTimeMillis() > (_pvpFlagLasts - 5000)) { - LOGGER.warning("error in pvp flag task: " + e); + updatePvPFlag(2); } + else + { + updatePvPFlag(1); + } + // } + // catch (Exception e) + // { + // LOGGER.warning("error in pvp flag task: " + e); + // } } } @@ -4688,14 +4688,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder { for (PlayerInstance player : getKnownList().getKnownPlayers().values()) { - try - { - player.sendPacket(su); - } - catch (NullPointerException e) - { - LOGGER.warning(e.toString()); - } + // try + // { + player.sendPacket(su); + // } + // catch (NullPointerException e) + // { + // LOGGER.warning(e.toString()); + // } } } } @@ -5507,18 +5507,18 @@ public abstract class Creature extends WorldObject implements ISkillsHolder final int gty = (originalY - World.MAP_MIN_Y) >> 4; if (isOnGeodataPath()) { - try + // try + // { + if ((gtx == _move.geoPathGtx) && (gty == _move.geoPathGty)) { - if ((gtx == _move.geoPathGtx) && (gty == _move.geoPathGty)) - { - return; - } - _move.onGeodataPathIndex = -1; // Set not on geodata path. - } - catch (NullPointerException e) - { - // nothing + return; } + _move.onGeodataPathIndex = -1; // Set not on geodata path. + // } + // catch (NullPointerException e) + // { + // // nothing + // } } // Temporary fix for character outside world region errors (should not happen) @@ -7333,117 +7333,117 @@ public abstract class Creature extends WorldObject implements ISkillsHolder } final List targets2 = targets; - try + // try + // { + if ((targets2 != null) && !targets2.isEmpty()) { - if ((targets2 != null) && !targets2.isEmpty()) + // Go through targets table + for (WorldObject target2 : targets2) { - // Go through targets table - for (WorldObject target2 : targets2) + if (target2 == null) { - if (target2 == null) + continue; + } + + if (target2 instanceof Playable) + { + final Creature target = (Creature) target2; + + // If the skill is type STEALTH(ex: Dance of Shadow) + if (skill.isAbnormalEffectByName(ABNORMAL_EFFECT_STEALTH)) { - continue; + final Effect silentMove = target.getFirstEffect(Effect.EffectType.SILENT_MOVE); + if (silentMove != null) + { + silentMove.exit(true); + } } - if (target2 instanceof Playable) + if ((skill.getSkillType() == SkillType.BUFF) || (skill.getSkillType() == SkillType.SEED)) { - final Creature target = (Creature) target2; + final SystemMessage smsg = new SystemMessage(SystemMessageId.THE_EFFECTS_OF_S1_FLOW_THROUGH_YOU); + smsg.addString(skill.getName()); + target.sendPacket(smsg); + } + + if ((this instanceof PlayerInstance) && (target instanceof Summon)) + { + ((Summon) target).getOwner().sendPacket(new PetInfo((Summon) target)); + sendPacket(new NpcInfo((Summon) target, this)); - // If the skill is type STEALTH(ex: Dance of Shadow) - if (skill.isAbnormalEffectByName(ABNORMAL_EFFECT_STEALTH)) - { - final Effect silentMove = target.getFirstEffect(Effect.EffectType.SILENT_MOVE); - if (silentMove != null) - { - silentMove.exit(true); - } - } - - if ((skill.getSkillType() == SkillType.BUFF) || (skill.getSkillType() == SkillType.SEED)) - { - final SystemMessage smsg = new SystemMessage(SystemMessageId.THE_EFFECTS_OF_S1_FLOW_THROUGH_YOU); - smsg.addString(skill.getName()); - target.sendPacket(smsg); - } - - if ((this instanceof PlayerInstance) && (target instanceof Summon)) - { - ((Summon) target).getOwner().sendPacket(new PetInfo((Summon) target)); - sendPacket(new NpcInfo((Summon) target, this)); - - // The PetInfo packet wipes the PartySpelled (list of active spells' icons). Re-add them - ((Summon) target).updateEffectIcons(true); - } + // The PetInfo packet wipes the PartySpelled (list of active spells' icons). Re-add them + ((Summon) target).updateEffectIcons(true); } } } } - catch (Exception e) + // } + // catch (Exception e) + // { + // LOGGER.warning(e.toString()); + // } + + // try + // { + final StatusUpdate su = new StatusUpdate(getObjectId()); + boolean isSendStatus = false; + + // Consume MP of the Creature and Send the Server->Client packet StatusUpdate with current HP and MP to all other PlayerInstance to inform + final double mpConsume = getStat().getMpConsume(skill); + if (mpConsume > 0) { - LOGGER.warning(e.toString()); + if (skill.isDance()) + { + getStatus().reduceMp(calcStat(Stat.DANCE_MP_CONSUME_RATE, mpConsume, null, null)); + } + else if (skill.isMagic()) + { + getStatus().reduceMp(calcStat(Stat.MAGICAL_MP_CONSUME_RATE, mpConsume, null, null)); + } + else + { + getStatus().reduceMp(calcStat(Stat.PHYSICAL_MP_CONSUME_RATE, mpConsume, null, null)); + } + + su.addAttribute(StatusUpdate.CUR_MP, (int) getStatus().getCurrentMp()); + isSendStatus = true; } - try + // Consume HP if necessary and Send the Server->Client packet StatusUpdate with current HP and MP to all other PlayerInstance to inform + if (skill.getHpConsume() > 0) { - final StatusUpdate su = new StatusUpdate(getObjectId()); - boolean isSendStatus = false; - - // Consume MP of the Creature and Send the Server->Client packet StatusUpdate with current HP and MP to all other PlayerInstance to inform - final double mpConsume = getStat().getMpConsume(skill); - if (mpConsume > 0) + double consumeHp; + consumeHp = calcStat(Stat.HP_CONSUME_RATE, skill.getHpConsume(), null, null); + if ((consumeHp + 1) >= getStatus().getCurrentHp()) { - if (skill.isDance()) - { - getStatus().reduceMp(calcStat(Stat.DANCE_MP_CONSUME_RATE, mpConsume, null, null)); - } - else if (skill.isMagic()) - { - getStatus().reduceMp(calcStat(Stat.MAGICAL_MP_CONSUME_RATE, mpConsume, null, null)); - } - else - { - getStatus().reduceMp(calcStat(Stat.PHYSICAL_MP_CONSUME_RATE, mpConsume, null, null)); - } - - su.addAttribute(StatusUpdate.CUR_MP, (int) getStatus().getCurrentMp()); - isSendStatus = true; + consumeHp = getStatus().getCurrentHp() - 1.0; } - // Consume HP if necessary and Send the Server->Client packet StatusUpdate with current HP and MP to all other PlayerInstance to inform - if (skill.getHpConsume() > 0) - { - double consumeHp; - consumeHp = calcStat(Stat.HP_CONSUME_RATE, skill.getHpConsume(), null, null); - if ((consumeHp + 1) >= getStatus().getCurrentHp()) - { - consumeHp = getStatus().getCurrentHp() - 1.0; - } - - getStatus().reduceHp(consumeHp, this); - su.addAttribute(StatusUpdate.CUR_HP, (int) getStatus().getCurrentHp()); - isSendStatus = true; - } - - // Send a Server->Client packet StatusUpdate with MP modification to the PlayerInstance - if (isSendStatus) - { - sendPacket(su); - } - - // Consume Items if necessary and Send the Server->Client packet InventoryUpdate with Item modification to all the Creature - if (skill.getItemConsume() > 0) - { - consumeItem(skill.getItemConsumeId(), skill.getItemConsume()); - } - - // Launch the magic skill in order to calculate its effects - callSkill(skill, targets); + getStatus().reduceHp(consumeHp, this); + su.addAttribute(StatusUpdate.CUR_HP, (int) getStatus().getCurrentHp()); + isSendStatus = true; } - catch (Exception e) + + // Send a Server->Client packet StatusUpdate with MP modification to the PlayerInstance + if (isSendStatus) { - LOGGER.warning(e.toString()); + sendPacket(su); } + // Consume Items if necessary and Send the Server->Client packet InventoryUpdate with Item modification to all the Creature + if (skill.getItemConsume() > 0) + { + consumeItem(skill.getItemConsumeId(), skill.getItemConsume()); + } + + // Launch the magic skill in order to calculate its effects + callSkill(skill, targets); + // } + // catch (Exception e) + // { + // LOGGER.warning(e.toString()); + // } + if (instant || (coolTime == 0)) { onMagicFinalizer(targets, skill); @@ -7560,23 +7560,23 @@ public abstract class Creature extends WorldObject implements ISkillsHolder // Launch weapon Special ability skill effect if available if (activeWeapon != null) { - try + // try + // { + if (targets != null) { - if (targets != null) + for (WorldObject target : targets) { - for (WorldObject target : targets) + if ((target instanceof Creature) && !((Creature) target).isDead() && activeWeapon.getSkillEffects(this, (Creature) target, skill)) { - if ((target instanceof Creature) && !((Creature) target).isDead() && activeWeapon.getSkillEffects(this, (Creature) target, skill)) - { - sendPacket(SystemMessage.sendString("Target affected by weapon special ability!")); - } + sendPacket(SystemMessage.sendString("Target affected by weapon special ability!")); } } } - catch (Exception e) - { - LOGGER.warning(e.toString()); - } + // } + // catch (Exception e) + // { + // LOGGER.warning(e.toString()); + // } } } } @@ -7755,312 +7755,283 @@ public abstract class Creature extends WorldObject implements ISkillsHolder */ public void callSkill(Skill skill, List targets) { - try + // try + // { + if (skill.isToggle() && (getFirstEffect(skill.getId()) != null)) { - if (skill.isToggle() && (getFirstEffect(skill.getId()) != null)) - { - return; - } - - if ((targets == null) || targets.isEmpty()) - { - getAI().notifyEvent(CtrlEvent.EVT_CANCEL); - return; - } - - // Do initial checkings for skills and set pvp flag/draw aggro when needed - for (WorldObject target : targets) + return; + } + + if ((targets == null) || targets.isEmpty()) + { + getAI().notifyEvent(CtrlEvent.EVT_CANCEL); + return; + } + + // Do initial checkings for skills and set pvp flag/draw aggro when needed + for (WorldObject target : targets) + { + if (target instanceof Creature) { + // Set some values inside target's instance for later use + final Creature creature = (Creature) target; + if ((skill.getEffectType() == SkillType.BUFF) && creature.isBlockBuff()) + { + continue; + } + if (target instanceof Creature) { - // Set some values inside target's instance for later use - final Creature creature = (Creature) target; - if ((skill.getEffectType() == SkillType.BUFF) && creature.isBlockBuff()) + final Creature targ = (Creature) target; + if (ChanceSkillList.canTriggerByCast(this, targ, skill)) { - continue; - } - - if (target instanceof Creature) - { - final Creature targ = (Creature) target; - if (ChanceSkillList.canTriggerByCast(this, targ, skill)) + // Maybe launch chance skills on us + if (_chanceSkills != null) { - // Maybe launch chance skills on us - if (_chanceSkills != null) - { - _chanceSkills.onSkillHit(targ, false, skill.isMagic(), skill.isOffensive()); - } - // Maybe launch chance skills on target - if (targ.getChanceSkills() != null) - { - targ.getChanceSkills().onSkillHit(this, true, skill.isMagic(), skill.isOffensive()); - } + _chanceSkills.onSkillHit(targ, false, skill.isMagic(), skill.isOffensive()); + } + // Maybe launch chance skills on target + if (targ.getChanceSkills() != null) + { + targ.getChanceSkills().onSkillHit(this, true, skill.isMagic(), skill.isOffensive()); } } + } + + if (Config.ALLOW_RAID_BOSS_PETRIFIED && ((this instanceof PlayerInstance) || (this instanceof Summon))) // Check if option is True Or False. + { + boolean toBeCursed = false; - if (Config.ALLOW_RAID_BOSS_PETRIFIED && ((this instanceof PlayerInstance) || (this instanceof Summon))) // Check if option is True Or False. + // check on BossZone raid lvl + if (!(creature.getTarget() instanceof Playable) && !(creature.getTarget() instanceof SummonInstance)) { - boolean toBeCursed = false; - - // check on BossZone raid lvl - if (!(creature.getTarget() instanceof Playable) && !(creature.getTarget() instanceof SummonInstance)) + // this must work just on mobs/raids + if ((creature.isRaid() && (getLevel() > (creature.getLevel() + 8))) || (!(creature instanceof PlayerInstance) && ((creature.getTarget() instanceof RaidBossInstance) && (getLevel() > (((RaidBossInstance) creature.getTarget()).getLevel() + 8)))) || (!(creature instanceof PlayerInstance) && ((creature.getTarget() instanceof GrandBossInstance) && (getLevel() > (((GrandBossInstance) creature.getTarget()).getLevel() + 8))))) { - // this must work just on mobs/raids - if ((creature.isRaid() && (getLevel() > (creature.getLevel() + 8))) || (!(creature instanceof PlayerInstance) && ((creature.getTarget() instanceof RaidBossInstance) && (getLevel() > (((RaidBossInstance) creature.getTarget()).getLevel() + 8)))) || (!(creature instanceof PlayerInstance) && ((creature.getTarget() instanceof GrandBossInstance) && (getLevel() > (((GrandBossInstance) creature.getTarget()).getLevel() + 8))))) + toBeCursed = true; + } + + // advanced check too if not already cursed + if (!toBeCursed) + { + int bossId = -1; + NpcTemplate bossTemplate = null; + final BossZone bossZone = GrandBossManager.getInstance().getZone(this); + if (bossZone != null) { - toBeCursed = true; + bossId = bossZone.getBossId(); } - // advanced check too if not already cursed - if (!toBeCursed) + if (bossId != -1) { - int bossId = -1; - NpcTemplate bossTemplate = null; - final BossZone bossZone = GrandBossManager.getInstance().getZone(this); - if (bossZone != null) + bossTemplate = NpcTable.getInstance().getTemplate(bossId); + if ((bossTemplate != null) && (getLevel() > (bossTemplate.getLevel() + 8))) { - bossId = bossZone.getBossId(); - } - - if (bossId != -1) - { - bossTemplate = NpcTable.getInstance().getTemplate(bossId); - if ((bossTemplate != null) && (getLevel() > (bossTemplate.getLevel() + 8))) + MonsterInstance bossInstance = null; + if (bossTemplate.getType().equals("RaidBoss")) { - MonsterInstance bossInstance = null; - if (bossTemplate.getType().equals("RaidBoss")) + if (RaidBossSpawnManager.getInstance().getStatSet(bossId) != null) { - if (RaidBossSpawnManager.getInstance().getStatSet(bossId) != null) - { - bossInstance = RaidBossSpawnManager.getInstance().getBoss(bossId); - } + bossInstance = RaidBossSpawnManager.getInstance().getBoss(bossId); } - else if (bossTemplate.getType().equals("GrandBoss")) + } + else if (bossTemplate.getType().equals("GrandBoss")) + { + if (GrandBossManager.getInstance().getStatSet(bossId) != null) { - if (GrandBossManager.getInstance().getStatSet(bossId) != null) - { - bossInstance = GrandBossManager.getInstance().getBoss(bossId); - } - } - - // max allowed rage into take cursed is 3000 - if ((bossInstance != null/* && alive */) && bossInstance.isInsideRadius(this, 3000, false, false)) - { - toBeCursed = true; + bossInstance = GrandBossManager.getInstance().getBoss(bossId); } } + + // max allowed rage into take cursed is 3000 + if ((bossInstance != null/* && alive */) && bossInstance.isInsideRadius(this, 3000, false, false)) + { + toBeCursed = true; + } } } } - - if (toBeCursed) + } + + if (toBeCursed) + { + if (skill.isMagic()) { - if (skill.isMagic()) + final Skill tempSkill = SkillTable.getInstance().getSkill(4215, 1); + if (tempSkill != null) { - final Skill tempSkill = SkillTable.getInstance().getSkill(4215, 1); - if (tempSkill != null) + abortAttack(); + abortCast(); + getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + tempSkill.getEffects(creature, this, false, false, false); + if (this instanceof Summon) { - abortAttack(); - abortCast(); - getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); - tempSkill.getEffects(creature, this, false, false, false); - if (this instanceof Summon) + final Summon src = ((Summon) this); + if (src.getOwner() != null) { - final Summon src = ((Summon) this); - if (src.getOwner() != null) - { - src.getOwner().abortAttack(); - src.getOwner().abortCast(); - src.getOwner().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); - tempSkill.getEffects(creature, src.getOwner(), false, false, false); - } + src.getOwner().abortAttack(); + src.getOwner().abortCast(); + src.getOwner().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + tempSkill.getEffects(creature, src.getOwner(), false, false, false); } } - else - { - LOGGER.warning("Skill 4215 at level 1 is missing in DP."); - } } else { - final Skill tempSkill = SkillTable.getInstance().getSkill(4515, 1); - if (tempSkill != null) + LOGGER.warning("Skill 4215 at level 1 is missing in DP."); + } + } + else + { + final Skill tempSkill = SkillTable.getInstance().getSkill(4515, 1); + if (tempSkill != null) + { + tempSkill.getEffects(creature, this, false, false, false); + } + else + { + LOGGER.warning("Skill 4515 at level 1 is missing in DP."); + } + + if (creature instanceof MinionInstance) + { + final MonsterInstance leader = ((MinionInstance) creature).getLeader(); + leader.stopHating(this); + if (leader.hasMinions()) { - tempSkill.getEffects(creature, this, false, false, false); - } - else - { - LOGGER.warning("Skill 4515 at level 1 is missing in DP."); - } - - if (creature instanceof MinionInstance) - { - final MonsterInstance leader = ((MinionInstance) creature).getLeader(); - leader.stopHating(this); - if (leader.hasMinions()) + for (MinionInstance minion : leader.getSpawnedMinions()) { - for (MinionInstance minion : leader.getSpawnedMinions()) + if (leader.getMostHated() == null) { - if (leader.getMostHated() == null) - { - ((AttackableAI) minion.getAI()).setGlobalAggro(-25); - minion.clearAggroList(); - minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); - minion.setWalking(); - } - if ((minion != null) && !minion.isDead()) - { - ((AttackableAI) minion.getAI()).setGlobalAggro(-25); - minion.clearAggroList(); - minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); - minion.addDamage(((Attackable) creature).getMostHated(), 100); - } + ((AttackableAI) minion.getAI()).setGlobalAggro(-25); + minion.clearAggroList(); + minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); + minion.setWalking(); } - } - } - else - { - ((Attackable) creature).stopHating(this); - final Collection spawnedMinions = ((MonsterInstance) creature).getSpawnedMinions(); - if ((spawnedMinions != null) && !spawnedMinions.isEmpty()) - { - for (MinionInstance minion : spawnedMinions) + if ((minion != null) && !minion.isDead()) { - if (((Attackable) creature).getMostHated() == null) - { - ((AttackableAI) minion.getAI()).setGlobalAggro(-25); - minion.clearAggroList(); - minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); - minion.setWalking(); - } - if ((minion != null) && !minion.isDead()) - { - ((AttackableAI) minion.getAI()).setGlobalAggro(-25); - minion.clearAggroList(); - minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); - minion.addDamage(((Attackable) creature).getMostHated(), 100); - } + ((AttackableAI) minion.getAI()).setGlobalAggro(-25); + minion.clearAggroList(); + minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); + minion.addDamage(((Attackable) creature).getMostHated(), 100); } } } } - return; + else + { + ((Attackable) creature).stopHating(this); + final Collection spawnedMinions = ((MonsterInstance) creature).getSpawnedMinions(); + if ((spawnedMinions != null) && !spawnedMinions.isEmpty()) + { + for (MinionInstance minion : spawnedMinions) + { + if (((Attackable) creature).getMostHated() == null) + { + ((AttackableAI) minion.getAI()).setGlobalAggro(-25); + minion.clearAggroList(); + minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); + minion.setWalking(); + } + if ((minion != null) && !minion.isDead()) + { + ((AttackableAI) minion.getAI()).setGlobalAggro(-25); + minion.clearAggroList(); + minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); + minion.addDamage(((Attackable) creature).getMostHated(), 100); + } + } + } + } + } + return; + } + } + + PlayerInstance activeChar = null; + if (this instanceof PlayerInstance) + { + activeChar = (PlayerInstance) this; + } + else if (this instanceof Summon) + { + activeChar = ((Summon) this).getOwner(); + } + + if (activeChar != null) + { + if (skill.isOffensive()) + { + if ((creature instanceof PlayerInstance) || (creature instanceof Summon)) + { + // Signets are a special case, casted on target_self but don't harm self + if ((skill.getSkillType() != SkillType.SIGNET) && (skill.getSkillType() != SkillType.SIGNET_CASTTIME)) + { + creature.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, activeChar); + activeChar.updatePvPStatus(creature); + } + } + else if (creature instanceof Attackable) + { + switch (skill.getSkillType()) + { + case AGGREDUCE: + case AGGREDUCE_CHAR: + case AGGREMOVE: + { + break; + } + default: + { + ((Creature) target).addAttackerToAttackByList(this); + int hitTime = Formulas.getInstance().calcMAtkSpd(activeChar, skill, skill.getHitTime()); + if ((checkBss() || checkSps()) && !skill.isStaticHitTime() && !skill.isPotion() && skill.isMagic()) + { + hitTime = (int) (0.70 * hitTime); + } + ThreadPool.schedule(new notifyAiTaskDelayed(CtrlEvent.EVT_ATTACKED, this, target), hitTime); + break; + } + } } } - + else if (creature instanceof PlayerInstance) + { + // Casting non offensive skill on player with pvp flag set or with karma + if (!creature.equals(this) && ((((PlayerInstance) creature).getPvpFlag() > 0) || (((PlayerInstance) creature).getKarma() > 0))) + { + activeChar.updatePvPStatus(); + } + } + else if ((creature instanceof Attackable) && (skill.getSkillType() != SkillType.SUMMON) && (skill.getSkillType() != SkillType.BEAST_FEED) && (skill.getSkillType() != SkillType.UNLOCK) && (skill.getSkillType() != SkillType.DELUXE_KEY_UNLOCK)) + { + activeChar.updatePvPStatus(this); + } + } + } + if (target instanceof MonsterInstance) + { + if (!skill.isOffensive() && (skill.getSkillType() != SkillType.UNLOCK) && (skill.getSkillType() != SkillType.SUMMON) && (skill.getSkillType() != SkillType.DELUXE_KEY_UNLOCK) && (skill.getSkillType() != SkillType.BEAST_FEED)) + { PlayerInstance activeChar = null; if (this instanceof PlayerInstance) { activeChar = (PlayerInstance) this; + activeChar.updatePvPStatus(activeChar); } else if (this instanceof Summon) { activeChar = ((Summon) this).getOwner(); } - - if (activeChar != null) - { - if (skill.isOffensive()) - { - if ((creature instanceof PlayerInstance) || (creature instanceof Summon)) - { - // Signets are a special case, casted on target_self but don't harm self - if ((skill.getSkillType() != SkillType.SIGNET) && (skill.getSkillType() != SkillType.SIGNET_CASTTIME)) - { - creature.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, activeChar); - activeChar.updatePvPStatus(creature); - } - } - else if (creature instanceof Attackable) - { - switch (skill.getSkillType()) - { - case AGGREDUCE: - case AGGREDUCE_CHAR: - case AGGREMOVE: - { - break; - } - default: - { - ((Creature) target).addAttackerToAttackByList(this); - int hitTime = Formulas.getInstance().calcMAtkSpd(activeChar, skill, skill.getHitTime()); - if ((checkBss() || checkSps()) && !skill.isStaticHitTime() && !skill.isPotion() && skill.isMagic()) - { - hitTime = (int) (0.70 * hitTime); - } - ThreadPool.schedule(new notifyAiTaskDelayed(CtrlEvent.EVT_ATTACKED, this, target), hitTime); - break; - } - } - } - } - else if (creature instanceof PlayerInstance) - { - // Casting non offensive skill on player with pvp flag set or with karma - if (!creature.equals(this) && ((((PlayerInstance) creature).getPvpFlag() > 0) || (((PlayerInstance) creature).getKarma() > 0))) - { - activeChar.updatePvPStatus(); - } - } - else if ((creature instanceof Attackable) && (skill.getSkillType() != SkillType.SUMMON) && (skill.getSkillType() != SkillType.BEAST_FEED) && (skill.getSkillType() != SkillType.UNLOCK) && (skill.getSkillType() != SkillType.DELUXE_KEY_UNLOCK)) - { - activeChar.updatePvPStatus(this); - } - } - } - if (target instanceof MonsterInstance) - { - if (!skill.isOffensive() && (skill.getSkillType() != SkillType.UNLOCK) && (skill.getSkillType() != SkillType.SUMMON) && (skill.getSkillType() != SkillType.DELUXE_KEY_UNLOCK) && (skill.getSkillType() != SkillType.BEAST_FEED)) - { - PlayerInstance activeChar = null; - if (this instanceof PlayerInstance) - { - activeChar = (PlayerInstance) this; - activeChar.updatePvPStatus(activeChar); - } - else if (this instanceof Summon) - { - activeChar = ((Summon) this).getOwner(); - } - } } } - - ISkillHandler handler = null; - // Check if the skill effects are already in progress on the Creature - if (skill.isToggle() && (getFirstEffect(skill.getId()) != null)) - { - handler = SkillHandler.getInstance().getSkillHandler(skill.getSkillType()); - if (handler != null) - { - handler.useSkill(this, skill, targets); - } - else - { - skill.useSkill(this, targets); - } - return; - } - - // Check if over-hit is possible - if (skill.isOverhit()) - { - // Set the "over-hit enabled" flag on each of the possible targets - for (WorldObject target : targets) - { - final Creature creature = (Creature) target; - if (creature instanceof Attackable) - { - ((Attackable) creature).overhitEnabled(true); - } - } - } - - // Get the skill handler corresponding to the skill type (PDAM, MDAM, SWEEP...) started in gameserver + } + + ISkillHandler handler = null; + // Check if the skill effects are already in progress on the Creature + if (skill.isToggle() && (getFirstEffect(skill.getId()) != null)) + { handler = SkillHandler.getInstance().getSkillHandler(skill.getSkillType()); - - // Launch the magic skill and calculate its effects if (handler != null) { handler.useSkill(this, skill, targets); @@ -8069,44 +8040,72 @@ public abstract class Creature extends WorldObject implements ISkillsHolder { skill.useSkill(this, targets); } - - // if the skill is a potion, must delete the potion item - if (skill.isPotion() && (this instanceof Playable)) + return; + } + + // Check if over-hit is possible + if (skill.isOverhit()) + { + // Set the "over-hit enabled" flag on each of the possible targets + for (WorldObject target : targets) { - Potions.deletePotionItem((Playable) this, skill.getId(), skill.getLevel()); - } - - if ((this instanceof PlayerInstance) || (this instanceof Summon)) - { - final PlayerInstance caster = this instanceof PlayerInstance ? (PlayerInstance) this : ((Summon) this).getOwner(); - for (WorldObject target : targets) + final Creature creature = (Creature) target; + if (creature instanceof Attackable) { - if (target instanceof NpcInstance) + ((Attackable) creature).overhitEnabled(true); + } + } + } + + // Get the skill handler corresponding to the skill type (PDAM, MDAM, SWEEP...) started in gameserver + handler = SkillHandler.getInstance().getSkillHandler(skill.getSkillType()); + + // Launch the magic skill and calculate its effects + if (handler != null) + { + handler.useSkill(this, skill, targets); + } + else + { + skill.useSkill(this, targets); + } + + // if the skill is a potion, must delete the potion item + if (skill.isPotion() && (this instanceof Playable)) + { + Potions.deletePotionItem((Playable) this, skill.getId(), skill.getLevel()); + } + + if ((this instanceof PlayerInstance) || (this instanceof Summon)) + { + final PlayerInstance caster = this instanceof PlayerInstance ? (PlayerInstance) this : ((Summon) this).getOwner(); + for (WorldObject target : targets) + { + if (target instanceof NpcInstance) + { + final NpcInstance npc = (NpcInstance) target; + for (Quest quest : npc.getTemplate().getEventQuests(EventType.ON_SKILL_USE)) { - final NpcInstance npc = (NpcInstance) target; - for (Quest quest : npc.getTemplate().getEventQuests(EventType.ON_SKILL_USE)) - { - quest.notifySkillUse(npc, caster, skill); - } + quest.notifySkillUse(npc, caster, skill); } } - - if (skill.getAggroPoints() > 0) + } + + if (skill.getAggroPoints() > 0) + { + for (WorldObject spMob : caster.getKnownList().getKnownObjects().values()) { - for (WorldObject spMob : caster.getKnownList().getKnownObjects().values()) + if (spMob instanceof NpcInstance) { - if (spMob instanceof NpcInstance) + final NpcInstance npcMob = (NpcInstance) spMob; + if (npcMob.isInsideRadius(caster, 1000, true, true) && npcMob.hasAI() && (npcMob.getAI().getIntention() == AI_INTENTION_ATTACK)) { - final NpcInstance npcMob = (NpcInstance) spMob; - if (npcMob.isInsideRadius(caster, 1000, true, true) && npcMob.hasAI() && (npcMob.getAI().getIntention() == AI_INTENTION_ATTACK)) + final WorldObject npcTarget = npcMob.getTarget(); + for (WorldObject target : targets) { - final WorldObject npcTarget = npcMob.getTarget(); - for (WorldObject target : targets) + if ((npcTarget == target) || (npcMob == target)) { - if ((npcTarget == target) || (npcMob == target)) - { - npcMob.seeSpell(caster, target, skill); - } + npcMob.seeSpell(caster, target, skill); } } } @@ -8114,10 +8113,11 @@ public abstract class Creature extends WorldObject implements ISkillsHolder } } } - catch (Exception e) - { - LOGGER.warning(e.getMessage()); - } + // } + // catch (Exception e) + // { + // LOGGER.warning(e.getMessage()); + // } } /** diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/actor/knownlist/WorldObjectKnownList.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/actor/knownlist/WorldObjectKnownList.java index 65de9f8507..7a0cef0bad 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/actor/knownlist/WorldObjectKnownList.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/actor/knownlist/WorldObjectKnownList.java @@ -141,9 +141,9 @@ public class WorldObjectKnownList else { // Go through all visible WorldObject near the Creature - for (WorldObject playable : World.getInstance().getVisiblePlayers(_activeObject)) + for (WorldObject object : World.getInstance().getVisibleObjects(_activeObject)) { - if (playable == null) + if ((object == null) || !object.isPlayable()) { return; } @@ -151,7 +151,7 @@ public class WorldObjectKnownList // Try to add object to active object's known objects // Creature only needs to see visible PlayerInstance and PlayableInstance, when moving. Other creatures are currently only known from initial spawn area. // Possibly look into getDistanceToForgetObject values before modifying this approach... - addKnownObject(playable); + addKnownObject(object); } } } diff --git a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/items/Weapon.java b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/items/Weapon.java index 26f4b66fcb..94f97a8a87 100644 --- a/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/items/Weapon.java +++ b/L2J_Mobius_C4_ScionsOfDestiny/java/org/l2jmobius/gameserver/model/items/Weapon.java @@ -16,7 +16,6 @@ */ package org.l2jmobius.gameserver.model.items; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -404,36 +403,36 @@ public class Weapon extends Item continue; // Skill condition not met } - try + // try + // { + // Get the skill handler corresponding to the skill type + final ISkillHandler handler = SkillHandler.getInstance().getSkillHandler(skill.getSkillType()); + final List targets = new ArrayList<>(); + targets.add(target); + + // Launch the magic skill and calculate its effects + if (handler != null) { - // Get the skill handler corresponding to the skill type - final ISkillHandler handler = SkillHandler.getInstance().getSkillHandler(skill.getSkillType()); - final List targets = new ArrayList<>(); - targets.add(target); - - // Launch the magic skill and calculate its effects - if (handler != null) - { - handler.useSkill(caster, skill, targets); - } - else - { - skill.useSkill(caster, targets); - } - - if ((caster instanceof PlayerInstance) && (target instanceof NpcInstance)) - { - for (Quest quest : ((NpcInstance) target).getTemplate().getEventQuests(EventType.ON_SKILL_USE)) - { - quest.notifySkillUse((NpcInstance) target, (PlayerInstance) caster, skill); - } - } - - output = true; + handler.useSkill(caster, skill, targets); } - catch (IOException e) + else { + skill.useSkill(caster, targets); } + + if ((caster instanceof PlayerInstance) && (target instanceof NpcInstance)) + { + for (Quest quest : ((NpcInstance) target).getTemplate().getEventQuests(EventType.ON_SKILL_USE)) + { + quest.notifySkillUse((NpcInstance) target, (PlayerInstance) caster, skill); + } + } + + output = true; + // } + // catch (IOException e) + // { + // } } return output; diff --git a/L2J_Mobius_C6_Interlude/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_C6_Interlude/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_C6_Interlude/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_C6_Interlude/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/ISkillHandler.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/ISkillHandler.java index 037b03a3a4..19f055b182 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/ISkillHandler.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/ISkillHandler.java @@ -16,7 +16,6 @@ */ package org.l2jmobius.gameserver.handler; -import java.io.IOException; import java.util.List; import org.l2jmobius.gameserver.model.Skill; @@ -30,9 +29,8 @@ public interface ISkillHandler * @param creature * @param skill * @param targets - * @throws IOException */ - void useSkill(Creature creature, Skill skill, List targets) throws IOException; + void useSkill(Creature creature, Skill skill, List targets); /** * this method is called at initialization to register all the item ids automatically diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/skillhandlers/Disablers.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/skillhandlers/Disablers.java index 0eabe67723..83686887f0 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/skillhandlers/Disablers.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/skillhandlers/Disablers.java @@ -16,7 +16,6 @@ */ package org.l2jmobius.gameserver.handler.skillhandlers; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; @@ -675,14 +674,14 @@ public class Disablers implements ISkillHandler final List tgts = new ArrayList<>(); tgts.add(target); - try - { - healhandler.useSkill(creature, skill, tgts); - } - catch (IOException e) - { - LOGGER.warning(e.getMessage()); - } + // try + // { + healhandler.useSkill(creature, skill, tgts); + // } + // catch (IOException e) + // { + // LOGGER.warning(e.getMessage()); + // } } } for (String stat : negateEffectTypes) diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/World.java index 7e7e20b8ba..1c40f10b4b 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/World.java @@ -115,21 +115,9 @@ public class World */ public void removeObjects(List list) { - for (WorldObject o : list) + for (int i = 0; i < list.size(); i++) { - _allObjects.remove(o.getObjectId()); - } - } - - /** - * Removes the objects. - * @param objects the objects - */ - public void removeObjects(WorldObject[] objects) - { - for (WorldObject o : objects) - { - _allObjects.remove(o.getObjectId()); + _allObjects.remove(list.get(i).getObjectId()); } } @@ -138,12 +126,12 @@ public class World *
    * Example of use:
    *
  • Client packets : Action, AttackRequest, RequestJoinParty, RequestJoinPledge...

  • - * @param oID Identifier of the WorldObject + * @param objectId Identifier of the WorldObject * @return the object */ - public WorldObject findObject(int oID) + public WorldObject findObject(int objectId) { - return _allObjects.get(oID); + return _allObjects.get(objectId); } /** @@ -308,12 +296,10 @@ public class World } // Go through the visible objects contained in the circular area - for (WorldObject wo : getVisibleObjects(object, 2000)) + final List visibleObjects = getVisibleObjects(object, 2000); + for (int i = 0; i < visibleObjects.size(); i++) { - if (wo == null) - { - continue; - } + final WorldObject wo = visibleObjects.get(i); // Add the object in WorldObjectHashSet(WorldObject) _knownObjects of the visible Creature according to conditions : // - Creature is visible @@ -342,8 +328,11 @@ public class World } // Go through the visible objects contained in the circular area - for (WorldObject wo : getVisibleObjects(object, 2000)) + final List visibleObjects = getVisibleObjects(object, 2000); + for (int i = 0; i < visibleObjects.size(); i++) { + final WorldObject wo = visibleObjects.get(i); + // Add the object in WorldObjectHashSet(WorldObject) _knownObjects of the visible Creature according to conditions : // - Creature is visible // - object is not already known @@ -417,10 +406,14 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); + // Remove the WorldObject from the WorldObjectHashSet(WorldObject) _knownObjects of the surrounding WorldRegion Creatures // If object is a PlayerInstance, remove the WorldObject from the WorldObjectHashSet(PlayerInstance) _knownPlayer of the surrounding WorldRegion Creatures // If object is targeted by one of the surrounding WorldRegion Creatures, cancel ATTACK and cast @@ -489,10 +482,13 @@ public class World final List result = new ArrayList<>(); // Go through the list of region - for (WorldRegion worldRegion : region.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = region.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == null) { continue; @@ -552,11 +548,14 @@ public class World final List result = new ArrayList<>(); // Go through the list of region - for (WorldRegion worldRegion : region.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = region.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { // Go through visible objects of the selected region - for (WorldObject wo : worldRegion.getVisibleObjects()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == null) { continue; @@ -614,10 +613,13 @@ public class World final List result = new ArrayList<>(); // Go through visible object of the selected region - for (WorldRegion worldRegion : object.getWorldRegion().getSurroundingRegions()) + final WorldRegion[] surroundingRegions = object.getWorldRegion().getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == null) { continue; @@ -644,58 +646,6 @@ public class World return result; } - /** - * Return all visible players of the WorldRegion object's and of its surrounding WorldRegion.
    - *
    - * Concept:
    - *
    - * All visible object are identified in _visibleObjects of their current WorldRegion
    - * All surrounding WorldRegion are identified in _surroundingRegions of the selected WorldRegion in order to scan a large area around a WorldObject
    - *
    - * Example of use:
    - *
  • Find Close Objects for Creature

  • - * @param object WorldObject that determine the current WorldRegion - * @return the visible playable - */ - public List getVisiblePlayers(WorldObject object) - { - final WorldRegion region = object.getWorldRegion(); - if (region == null) - { - return Collections.emptyList(); - } - - // Create a list in order to contain all visible WorldObject - final List result = new ArrayList<>(); - - // Go through the list of region - for (WorldRegion worldRegion : region.getSurroundingRegions()) - { - // Go through visible object of the selected region - for (PlayerInstance playable : worldRegion.getAllPlayers()) - { - if (playable == null) - { - continue; - } - - if (playable.equals(object)) - { - continue; // skip our own character - } - - if (!playable.isSpawned()) - { - continue; // skip dying objects - } - - result.add(playable); - } - } - - return result; - } - /** * Calculate the current WorldRegions of the object according to its position (x,y).
    *
    @@ -793,24 +743,6 @@ public class World LOGGER.info("All visible NPCs deleted."); } - /** - * Gets the account players. - * @param account the account_name - * @return the account players - */ - public List getAccountPlayers(String account) - { - final List result = new ArrayList<>(); - for (PlayerInstance actual : _allPlayers.values()) - { - if (actual.getAccountName().equals(account)) - { - result.add(actual); - } - } - return result; - } - public static World getInstance() { return SingletonHolder.INSTANCE; diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/WorldRegion.java index fbcc836ef0..36d0b686ac 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,10 +16,9 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Collection; +import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import java.util.logging.Logger; @@ -31,9 +30,7 @@ import org.l2jmobius.gameserver.ai.SiegeGuardAI; import org.l2jmobius.gameserver.datatables.sql.SpawnTable; import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Creature; -import org.l2jmobius.gameserver.model.actor.Playable; import org.l2jmobius.gameserver.model.actor.instance.NpcInstance; -import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.spawn.Spawn; import org.l2jmobius.gameserver.model.zone.ZoneManager; import org.l2jmobius.gameserver.model.zone.ZoneType; @@ -44,8 +41,7 @@ public class WorldRegion { private static final Logger LOGGER = Logger.getLogger(WorldRegion.class.getName()); - private final Collection _playerObjects = ConcurrentHashMap.newKeySet(); - private final Collection _visibleObjects = ConcurrentHashMap.newKeySet(); + private final List _visibleObjects = new ArrayList<>(); private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -74,7 +70,6 @@ public class WorldRegion { return; } - _zoneManager.unregisterZone(zone); } @@ -127,8 +122,9 @@ public class WorldRegion { if (!isOn) { - for (WorldObject wo : _visibleObjects) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo instanceof Attackable) { final Attackable mob = (Attackable) wo; @@ -174,8 +170,9 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo instanceof Attackable) { // Start HP/MP/CP Regeneration task @@ -190,20 +187,28 @@ public class WorldRegion } } - public Boolean isActive() + public boolean isActive() { return _active; } // check if all 9 neighbors (including self) are inactive or active but with no players. // returns true if the above condition is met. - public Boolean areNeighborsEmpty() + public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && !worldRegion.getAllPlayers().isEmpty()) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -246,9 +251,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -272,8 +277,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -296,18 +302,19 @@ public class WorldRegion return; } - _visibleObjects.add(object); - - if (object instanceof PlayerInstance) + synchronized (_visibleObjects) { - _playerObjects.add((PlayerInstance) object); - - // if this is the first player to enter the region, activate self & neighbors - if ((_playerObjects.size() == 1) && !Config.GRIDS_ALWAYS_ON) + if (!_visibleObjects.contains(object)) { - startActivation(); + _visibleObjects.add(object); } } + + // If this is the first player to enter the region, activate self and neighbors. + if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) + { + startActivation(); + } } /** @@ -323,22 +330,36 @@ public class WorldRegion return; } - _visibleObjects.remove(object); - - if (object instanceof Playable) + if (_visibleObjects.isEmpty()) { - _playerObjects.remove(object); - - if (_playerObjects.isEmpty() && !Config.GRIDS_ALWAYS_ON) - { - startDeactivation(); - } + return; + } + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } + + if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) + { + startDeactivation(); } } public void setSurroundingRegions(WorldRegion[] regions) { _surroundingRegions = regions; + + // Make sure that this region is always the first region to improve bulk operations when this region should be updated first. + for (int i = 0; i < _surroundingRegions.length; i++) + { + if (_surroundingRegions[i] == this) + { + final WorldRegion first = _surroundingRegions[0]; + _surroundingRegions[0] = this; + _surroundingRegions[i] = first; + } + } } /** @@ -349,12 +370,7 @@ public class WorldRegion return _surroundingRegions; } - public Collection getAllPlayers() - { - return _playerObjects; - } - - public Collection getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } @@ -370,8 +386,9 @@ public class WorldRegion public synchronized void deleteVisibleNpcSpawns() { LOGGER.info("Deleting all visible NPCs in Region: " + getName()); - for (WorldObject obj : _visibleObjects) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject obj = _visibleObjects.get(i); if (obj instanceof NpcInstance) { final NpcInstance target = (NpcInstance) obj; @@ -404,8 +421,10 @@ public class WorldRegion final int down = y - range; final int left = x + range; final int right = x - range; - for (ZoneType e : _zoneManager.getZones()) + final List zones = _zoneManager.getZones(); + for (int i = 0; i < zones.size(); i++) { + final ZoneType e = zones.get(i); if (e instanceof PeaceZone) { if (e.isInsideZone(x, up, z)) diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/Creature.java index 972b248436..a88b8f9455 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/Creature.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/Creature.java @@ -2796,17 +2796,17 @@ public abstract class Creature extends WorldObject implements ISkillsHolder @Override public void run() { - try + // try + // { + if (_creature != null) { - if (_creature != null) - { - _creature.enableSkill(_skill); - } - } - catch (Throwable e) - { - LOGGER.warning(e.getMessage()); + _creature.enableSkill(_skill); } + // } + // catch (Throwable e) + // { + // LOGGER.warning(e.getMessage()); + // } } } @@ -2850,14 +2850,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder @Override public void run() { - try - { - onHitTimer(_hitTarget, _damage, _crit, _miss, _soulshot, _shld); - } - catch (Throwable e) - { - LOGGER.warning("fixme:hit task unhandled exception " + e); - } + // try + // { + onHitTimer(_hitTarget, _damage, _crit, _miss, _soulshot, _shld); + // } + // catch (Throwable e) + // { + // LOGGER.warning("fixme:hit task unhandled exception " + e); + // } } } @@ -2950,14 +2950,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder @Override public void run() { - try - { - _currPlayer.useMagic(_queuedSkill, _isCtrlPressed, _isShiftPressed); - } - catch (Throwable e) - { - LOGGER.warning(e.getMessage()); - } + // try + // { + _currPlayer.useMagic(_queuedSkill, _isCtrlPressed, _isShiftPressed); + // } + // catch (Throwable e) + // { + // LOGGER.warning(e.getMessage()); + // } } } @@ -2980,14 +2980,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder @Override public void run() { - try - { - getAI().notifyEvent(_evt, null); - } - catch (Throwable t) - { - LOGGER.warning(t.getMessage()); - } + // try + // { + getAI().notifyEvent(_evt, null); + // } + // catch (Throwable t) + // { + // LOGGER.warning(t.getMessage()); + // } } } @@ -2999,25 +2999,25 @@ public abstract class Creature extends WorldObject implements ISkillsHolder @Override public void run() { - try + // try + // { + if (System.currentTimeMillis() > _pvpFlagLasts) { - if (System.currentTimeMillis() > _pvpFlagLasts) - { - stopPvPFlag(); - } - else if (System.currentTimeMillis() > (_pvpFlagLasts - 5000)) - { - updatePvPFlag(2); - } - else - { - updatePvPFlag(1); - } + stopPvPFlag(); } - catch (Exception e) + else if (System.currentTimeMillis() > (_pvpFlagLasts - 5000)) { - LOGGER.warning("error in pvp flag task: " + e); + updatePvPFlag(2); } + else + { + updatePvPFlag(1); + } + // } + // catch (Exception e) + // { + // LOGGER.warning("error in pvp flag task: " + e); + // } } } @@ -4736,14 +4736,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder { for (PlayerInstance player : getKnownList().getKnownPlayers().values()) { - try - { - player.sendPacket(su); - } - catch (NullPointerException e) - { - LOGGER.warning(e.toString()); - } + // try + // { + player.sendPacket(su); + // } + // catch (NullPointerException e) + // { + // LOGGER.warning(e.toString()); + // } } } } @@ -5555,18 +5555,18 @@ public abstract class Creature extends WorldObject implements ISkillsHolder final int gty = (originalY - World.MAP_MIN_Y) >> 4; if (isOnGeodataPath()) { - try + // try + // { + if ((gtx == _move.geoPathGtx) && (gty == _move.geoPathGty)) { - if ((gtx == _move.geoPathGtx) && (gty == _move.geoPathGty)) - { - return; - } - _move.onGeodataPathIndex = -1; // Set not on geodata path. - } - catch (NullPointerException e) - { - // nothing + return; } + _move.onGeodataPathIndex = -1; // Set not on geodata path. + // } + // catch (NullPointerException e) + // { + // // nothing + // } } // Temporary fix for character outside world region errors (should not happen) @@ -7382,117 +7382,117 @@ public abstract class Creature extends WorldObject implements ISkillsHolder } final List targets2 = targets; - try + // try + // { + if ((targets2 != null) && !targets2.isEmpty()) { - if ((targets2 != null) && !targets2.isEmpty()) + // Go through targets table + for (WorldObject target2 : targets2) { - // Go through targets table - for (WorldObject target2 : targets2) + if (target2 == null) { - if (target2 == null) + continue; + } + + if (target2 instanceof Playable) + { + final Creature target = (Creature) target2; + + // If the skill is type STEALTH(ex: Dance of Shadow) + if (skill.isAbnormalEffectByName(ABNORMAL_EFFECT_STEALTH)) { - continue; + final Effect silentMove = target.getFirstEffect(Effect.EffectType.SILENT_MOVE); + if (silentMove != null) + { + silentMove.exit(true); + } } - if (target2 instanceof Playable) + if ((skill.getSkillType() == SkillType.BUFF) || (skill.getSkillType() == SkillType.SEED)) { - final Creature target = (Creature) target2; + final SystemMessage smsg = new SystemMessage(SystemMessageId.THE_EFFECTS_OF_S1_FLOW_THROUGH_YOU); + smsg.addString(skill.getName()); + target.sendPacket(smsg); + } + + if ((this instanceof PlayerInstance) && (target instanceof Summon)) + { + ((Summon) target).getOwner().sendPacket(new PetInfo((Summon) target)); + sendPacket(new NpcInfo((Summon) target, this)); - // If the skill is type STEALTH(ex: Dance of Shadow) - if (skill.isAbnormalEffectByName(ABNORMAL_EFFECT_STEALTH)) - { - final Effect silentMove = target.getFirstEffect(Effect.EffectType.SILENT_MOVE); - if (silentMove != null) - { - silentMove.exit(true); - } - } - - if ((skill.getSkillType() == SkillType.BUFF) || (skill.getSkillType() == SkillType.SEED)) - { - final SystemMessage smsg = new SystemMessage(SystemMessageId.THE_EFFECTS_OF_S1_FLOW_THROUGH_YOU); - smsg.addString(skill.getName()); - target.sendPacket(smsg); - } - - if ((this instanceof PlayerInstance) && (target instanceof Summon)) - { - ((Summon) target).getOwner().sendPacket(new PetInfo((Summon) target)); - sendPacket(new NpcInfo((Summon) target, this)); - - // The PetInfo packet wipes the PartySpelled (list of active spells' icons). Re-add them - ((Summon) target).updateEffectIcons(true); - } + // The PetInfo packet wipes the PartySpelled (list of active spells' icons). Re-add them + ((Summon) target).updateEffectIcons(true); } } } } - catch (Exception e) + // } + // catch (Exception e) + // { + // LOGGER.warning(e.toString()); + // } + + // try + // { + final StatusUpdate su = new StatusUpdate(getObjectId()); + boolean isSendStatus = false; + + // Consume MP of the Creature and Send the Server->Client packet StatusUpdate with current HP and MP to all other PlayerInstance to inform + final double mpConsume = getStat().getMpConsume(skill); + if (mpConsume > 0) { - LOGGER.warning(e.toString()); + if (skill.isDance()) + { + getStatus().reduceMp(calcStat(Stat.DANCE_MP_CONSUME_RATE, mpConsume, null, null)); + } + else if (skill.isMagic()) + { + getStatus().reduceMp(calcStat(Stat.MAGICAL_MP_CONSUME_RATE, mpConsume, null, null)); + } + else + { + getStatus().reduceMp(calcStat(Stat.PHYSICAL_MP_CONSUME_RATE, mpConsume, null, null)); + } + + su.addAttribute(StatusUpdate.CUR_MP, (int) getStatus().getCurrentMp()); + isSendStatus = true; } - try + // Consume HP if necessary and Send the Server->Client packet StatusUpdate with current HP and MP to all other PlayerInstance to inform + if (skill.getHpConsume() > 0) { - final StatusUpdate su = new StatusUpdate(getObjectId()); - boolean isSendStatus = false; - - // Consume MP of the Creature and Send the Server->Client packet StatusUpdate with current HP and MP to all other PlayerInstance to inform - final double mpConsume = getStat().getMpConsume(skill); - if (mpConsume > 0) + double consumeHp; + consumeHp = calcStat(Stat.HP_CONSUME_RATE, skill.getHpConsume(), null, null); + if ((consumeHp + 1) >= getStatus().getCurrentHp()) { - if (skill.isDance()) - { - getStatus().reduceMp(calcStat(Stat.DANCE_MP_CONSUME_RATE, mpConsume, null, null)); - } - else if (skill.isMagic()) - { - getStatus().reduceMp(calcStat(Stat.MAGICAL_MP_CONSUME_RATE, mpConsume, null, null)); - } - else - { - getStatus().reduceMp(calcStat(Stat.PHYSICAL_MP_CONSUME_RATE, mpConsume, null, null)); - } - - su.addAttribute(StatusUpdate.CUR_MP, (int) getStatus().getCurrentMp()); - isSendStatus = true; + consumeHp = getStatus().getCurrentHp() - 1.0; } - // Consume HP if necessary and Send the Server->Client packet StatusUpdate with current HP and MP to all other PlayerInstance to inform - if (skill.getHpConsume() > 0) - { - double consumeHp; - consumeHp = calcStat(Stat.HP_CONSUME_RATE, skill.getHpConsume(), null, null); - if ((consumeHp + 1) >= getStatus().getCurrentHp()) - { - consumeHp = getStatus().getCurrentHp() - 1.0; - } - - getStatus().reduceHp(consumeHp, this); - su.addAttribute(StatusUpdate.CUR_HP, (int) getStatus().getCurrentHp()); - isSendStatus = true; - } - - // Send a Server->Client packet StatusUpdate with MP modification to the PlayerInstance - if (isSendStatus) - { - sendPacket(su); - } - - // Consume Items if necessary and Send the Server->Client packet InventoryUpdate with Item modification to all the Creature - if (skill.getItemConsume() > 0) - { - consumeItem(skill.getItemConsumeId(), skill.getItemConsume()); - } - - // Launch the magic skill in order to calculate its effects - callSkill(skill, targets); + getStatus().reduceHp(consumeHp, this); + su.addAttribute(StatusUpdate.CUR_HP, (int) getStatus().getCurrentHp()); + isSendStatus = true; } - catch (Exception e) + + // Send a Server->Client packet StatusUpdate with MP modification to the PlayerInstance + if (isSendStatus) { - LOGGER.warning(e.toString()); + sendPacket(su); } + // Consume Items if necessary and Send the Server->Client packet InventoryUpdate with Item modification to all the Creature + if (skill.getItemConsume() > 0) + { + consumeItem(skill.getItemConsumeId(), skill.getItemConsume()); + } + + // Launch the magic skill in order to calculate its effects + callSkill(skill, targets); + // } + // catch (Exception e) + // { + // LOGGER.warning(e.toString()); + // } + if (instant || (coolTime == 0)) { onMagicFinalizer(targets, skill); @@ -7609,23 +7609,23 @@ public abstract class Creature extends WorldObject implements ISkillsHolder // Launch weapon Special ability skill effect if available if (activeWeapon != null) { - try + // try + // { + if (targets != null) { - if (targets != null) + for (WorldObject target : targets) { - for (WorldObject target : targets) + if ((target instanceof Creature) && !((Creature) target).isDead() && activeWeapon.getSkillEffects(this, (Creature) target, skill)) { - if ((target instanceof Creature) && !((Creature) target).isDead() && activeWeapon.getSkillEffects(this, (Creature) target, skill)) - { - sendPacket(SystemMessage.sendString("Target affected by weapon special ability!")); - } + sendPacket(SystemMessage.sendString("Target affected by weapon special ability!")); } } } - catch (Exception e) - { - LOGGER.warning(e.toString()); - } + // } + // catch (Exception e) + // { + // LOGGER.warning(e.toString()); + // } } } } @@ -7804,312 +7804,283 @@ public abstract class Creature extends WorldObject implements ISkillsHolder */ public void callSkill(Skill skill, List targets) { - try + // try + // { + if (skill.isToggle() && (getFirstEffect(skill.getId()) != null)) { - if (skill.isToggle() && (getFirstEffect(skill.getId()) != null)) - { - return; - } - - if ((targets == null) || targets.isEmpty()) - { - getAI().notifyEvent(CtrlEvent.EVT_CANCEL); - return; - } - - // Do initial checkings for skills and set pvp flag/draw aggro when needed - for (WorldObject target : targets) + return; + } + + if ((targets == null) || targets.isEmpty()) + { + getAI().notifyEvent(CtrlEvent.EVT_CANCEL); + return; + } + + // Do initial checkings for skills and set pvp flag/draw aggro when needed + for (WorldObject target : targets) + { + if (target instanceof Creature) { + // Set some values inside target's instance for later use + final Creature creature = (Creature) target; + if ((skill.getEffectType() == SkillType.BUFF) && creature.isBlockBuff()) + { + continue; + } + if (target instanceof Creature) { - // Set some values inside target's instance for later use - final Creature creature = (Creature) target; - if ((skill.getEffectType() == SkillType.BUFF) && creature.isBlockBuff()) + final Creature targ = (Creature) target; + if (ChanceSkillList.canTriggerByCast(this, targ, skill)) { - continue; - } - - if (target instanceof Creature) - { - final Creature targ = (Creature) target; - if (ChanceSkillList.canTriggerByCast(this, targ, skill)) + // Maybe launch chance skills on us + if (_chanceSkills != null) { - // Maybe launch chance skills on us - if (_chanceSkills != null) - { - _chanceSkills.onSkillHit(targ, false, skill.isMagic(), skill.isOffensive()); - } - // Maybe launch chance skills on target - if (targ.getChanceSkills() != null) - { - targ.getChanceSkills().onSkillHit(this, true, skill.isMagic(), skill.isOffensive()); - } + _chanceSkills.onSkillHit(targ, false, skill.isMagic(), skill.isOffensive()); + } + // Maybe launch chance skills on target + if (targ.getChanceSkills() != null) + { + targ.getChanceSkills().onSkillHit(this, true, skill.isMagic(), skill.isOffensive()); } } + } + + if (Config.ALLOW_RAID_BOSS_PETRIFIED && ((this instanceof PlayerInstance) || (this instanceof Summon))) // Check if option is True Or False. + { + boolean toBeCursed = false; - if (Config.ALLOW_RAID_BOSS_PETRIFIED && ((this instanceof PlayerInstance) || (this instanceof Summon))) // Check if option is True Or False. + // check on BossZone raid lvl + if (!(creature.getTarget() instanceof Playable) && !(creature.getTarget() instanceof SummonInstance)) { - boolean toBeCursed = false; - - // check on BossZone raid lvl - if (!(creature.getTarget() instanceof Playable) && !(creature.getTarget() instanceof SummonInstance)) + // this must work just on mobs/raids + if ((creature.isRaid() && (getLevel() > (creature.getLevel() + 8))) || (!(creature instanceof PlayerInstance) && ((creature.getTarget() instanceof RaidBossInstance) && (getLevel() > (((RaidBossInstance) creature.getTarget()).getLevel() + 8)))) || (!(creature instanceof PlayerInstance) && ((creature.getTarget() instanceof GrandBossInstance) && (getLevel() > (((GrandBossInstance) creature.getTarget()).getLevel() + 8))))) { - // this must work just on mobs/raids - if ((creature.isRaid() && (getLevel() > (creature.getLevel() + 8))) || (!(creature instanceof PlayerInstance) && ((creature.getTarget() instanceof RaidBossInstance) && (getLevel() > (((RaidBossInstance) creature.getTarget()).getLevel() + 8)))) || (!(creature instanceof PlayerInstance) && ((creature.getTarget() instanceof GrandBossInstance) && (getLevel() > (((GrandBossInstance) creature.getTarget()).getLevel() + 8))))) + toBeCursed = true; + } + + // advanced check too if not already cursed + if (!toBeCursed) + { + int bossId = -1; + NpcTemplate bossTemplate = null; + final BossZone bossZone = GrandBossManager.getInstance().getZone(this); + if (bossZone != null) { - toBeCursed = true; + bossId = bossZone.getBossId(); } - // advanced check too if not already cursed - if (!toBeCursed) + if (bossId != -1) { - int bossId = -1; - NpcTemplate bossTemplate = null; - final BossZone bossZone = GrandBossManager.getInstance().getZone(this); - if (bossZone != null) + bossTemplate = NpcTable.getInstance().getTemplate(bossId); + if ((bossTemplate != null) && (getLevel() > (bossTemplate.getLevel() + 8))) { - bossId = bossZone.getBossId(); - } - - if (bossId != -1) - { - bossTemplate = NpcTable.getInstance().getTemplate(bossId); - if ((bossTemplate != null) && (getLevel() > (bossTemplate.getLevel() + 8))) + MonsterInstance bossInstance = null; + if (bossTemplate.getType().equals("RaidBoss")) { - MonsterInstance bossInstance = null; - if (bossTemplate.getType().equals("RaidBoss")) + if (RaidBossSpawnManager.getInstance().getStatSet(bossId) != null) { - if (RaidBossSpawnManager.getInstance().getStatSet(bossId) != null) - { - bossInstance = RaidBossSpawnManager.getInstance().getBoss(bossId); - } + bossInstance = RaidBossSpawnManager.getInstance().getBoss(bossId); } - else if (bossTemplate.getType().equals("GrandBoss")) + } + else if (bossTemplate.getType().equals("GrandBoss")) + { + if (GrandBossManager.getInstance().getStatSet(bossId) != null) { - if (GrandBossManager.getInstance().getStatSet(bossId) != null) - { - bossInstance = GrandBossManager.getInstance().getBoss(bossId); - } - } - - // max allowed rage into take cursed is 3000 - if ((bossInstance != null/* && alive */) && bossInstance.isInsideRadius(this, 3000, false, false)) - { - toBeCursed = true; + bossInstance = GrandBossManager.getInstance().getBoss(bossId); } } + + // max allowed rage into take cursed is 3000 + if ((bossInstance != null/* && alive */) && bossInstance.isInsideRadius(this, 3000, false, false)) + { + toBeCursed = true; + } } } } - - if (toBeCursed) + } + + if (toBeCursed) + { + if (skill.isMagic()) { - if (skill.isMagic()) + final Skill tempSkill = SkillTable.getInstance().getSkill(4215, 1); + if (tempSkill != null) { - final Skill tempSkill = SkillTable.getInstance().getSkill(4215, 1); - if (tempSkill != null) + abortAttack(); + abortCast(); + getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + tempSkill.getEffects(creature, this, false, false, false); + if (this instanceof Summon) { - abortAttack(); - abortCast(); - getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); - tempSkill.getEffects(creature, this, false, false, false); - if (this instanceof Summon) + final Summon src = ((Summon) this); + if (src.getOwner() != null) { - final Summon src = ((Summon) this); - if (src.getOwner() != null) - { - src.getOwner().abortAttack(); - src.getOwner().abortCast(); - src.getOwner().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); - tempSkill.getEffects(creature, src.getOwner(), false, false, false); - } + src.getOwner().abortAttack(); + src.getOwner().abortCast(); + src.getOwner().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + tempSkill.getEffects(creature, src.getOwner(), false, false, false); } } - else - { - LOGGER.warning("Skill 4215 at level 1 is missing in DP."); - } } else { - final Skill tempSkill = SkillTable.getInstance().getSkill(4515, 1); - if (tempSkill != null) + LOGGER.warning("Skill 4215 at level 1 is missing in DP."); + } + } + else + { + final Skill tempSkill = SkillTable.getInstance().getSkill(4515, 1); + if (tempSkill != null) + { + tempSkill.getEffects(creature, this, false, false, false); + } + else + { + LOGGER.warning("Skill 4515 at level 1 is missing in DP."); + } + + if (creature instanceof MinionInstance) + { + final MonsterInstance leader = ((MinionInstance) creature).getLeader(); + leader.stopHating(this); + if (leader.hasMinions()) { - tempSkill.getEffects(creature, this, false, false, false); - } - else - { - LOGGER.warning("Skill 4515 at level 1 is missing in DP."); - } - - if (creature instanceof MinionInstance) - { - final MonsterInstance leader = ((MinionInstance) creature).getLeader(); - leader.stopHating(this); - if (leader.hasMinions()) + for (MinionInstance minion : leader.getSpawnedMinions()) { - for (MinionInstance minion : leader.getSpawnedMinions()) + if (leader.getMostHated() == null) { - if (leader.getMostHated() == null) - { - ((AttackableAI) minion.getAI()).setGlobalAggro(-25); - minion.clearAggroList(); - minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); - minion.setWalking(); - } - if ((minion != null) && !minion.isDead()) - { - ((AttackableAI) minion.getAI()).setGlobalAggro(-25); - minion.clearAggroList(); - minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); - minion.addDamage(((Attackable) creature).getMostHated(), 100); - } + ((AttackableAI) minion.getAI()).setGlobalAggro(-25); + minion.clearAggroList(); + minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); + minion.setWalking(); } - } - } - else - { - ((Attackable) creature).stopHating(this); - final Collection spawnedMinions = ((MonsterInstance) creature).getSpawnedMinions(); - if ((spawnedMinions != null) && !spawnedMinions.isEmpty()) - { - for (MinionInstance minion : spawnedMinions) + if ((minion != null) && !minion.isDead()) { - if (((Attackable) creature).getMostHated() == null) - { - ((AttackableAI) minion.getAI()).setGlobalAggro(-25); - minion.clearAggroList(); - minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); - minion.setWalking(); - } - if ((minion != null) && !minion.isDead()) - { - ((AttackableAI) minion.getAI()).setGlobalAggro(-25); - minion.clearAggroList(); - minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); - minion.addDamage(((Attackable) creature).getMostHated(), 100); - } + ((AttackableAI) minion.getAI()).setGlobalAggro(-25); + minion.clearAggroList(); + minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); + minion.addDamage(((Attackable) creature).getMostHated(), 100); } } } } - return; + else + { + ((Attackable) creature).stopHating(this); + final Collection spawnedMinions = ((MonsterInstance) creature).getSpawnedMinions(); + if ((spawnedMinions != null) && !spawnedMinions.isEmpty()) + { + for (MinionInstance minion : spawnedMinions) + { + if (((Attackable) creature).getMostHated() == null) + { + ((AttackableAI) minion.getAI()).setGlobalAggro(-25); + minion.clearAggroList(); + minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); + minion.setWalking(); + } + if ((minion != null) && !minion.isDead()) + { + ((AttackableAI) minion.getAI()).setGlobalAggro(-25); + minion.clearAggroList(); + minion.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); + minion.addDamage(((Attackable) creature).getMostHated(), 100); + } + } + } + } + } + return; + } + } + + PlayerInstance activeChar = null; + if (this instanceof PlayerInstance) + { + activeChar = (PlayerInstance) this; + } + else if (this instanceof Summon) + { + activeChar = ((Summon) this).getOwner(); + } + + if (activeChar != null) + { + if (skill.isOffensive()) + { + if ((creature instanceof PlayerInstance) || (creature instanceof Summon)) + { + // Signets are a special case, casted on target_self but don't harm self + if ((skill.getSkillType() != SkillType.SIGNET) && (skill.getSkillType() != SkillType.SIGNET_CASTTIME)) + { + creature.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, activeChar); + activeChar.updatePvPStatus(creature); + } + } + else if (creature instanceof Attackable) + { + switch (skill.getSkillType()) + { + case AGGREDUCE: + case AGGREDUCE_CHAR: + case AGGREMOVE: + { + break; + } + default: + { + ((Creature) target).addAttackerToAttackByList(this); + int hitTime = Formulas.getInstance().calcMAtkSpd(activeChar, skill, skill.getHitTime()); + if ((checkBss() || checkSps()) && !skill.isStaticHitTime() && !skill.isPotion() && skill.isMagic()) + { + hitTime = (int) (0.70 * hitTime); + } + ThreadPool.schedule(new notifyAiTaskDelayed(CtrlEvent.EVT_ATTACKED, this, target), hitTime); + break; + } + } } } - + else if (creature instanceof PlayerInstance) + { + // Casting non offensive skill on player with pvp flag set or with karma + if (!creature.equals(this) && ((((PlayerInstance) creature).getPvpFlag() > 0) || (((PlayerInstance) creature).getKarma() > 0))) + { + activeChar.updatePvPStatus(); + } + } + else if ((creature instanceof Attackable) && (skill.getSkillType() != SkillType.SUMMON) && (skill.getSkillType() != SkillType.BEAST_FEED) && (skill.getSkillType() != SkillType.UNLOCK) && (skill.getSkillType() != SkillType.DELUXE_KEY_UNLOCK)) + { + activeChar.updatePvPStatus(this); + } + } + } + if (target instanceof MonsterInstance) + { + if (!skill.isOffensive() && (skill.getSkillType() != SkillType.UNLOCK) && (skill.getSkillType() != SkillType.SUMMON) && (skill.getSkillType() != SkillType.DELUXE_KEY_UNLOCK) && (skill.getSkillType() != SkillType.BEAST_FEED)) + { PlayerInstance activeChar = null; if (this instanceof PlayerInstance) { activeChar = (PlayerInstance) this; + activeChar.updatePvPStatus(activeChar); } else if (this instanceof Summon) { activeChar = ((Summon) this).getOwner(); } - - if (activeChar != null) - { - if (skill.isOffensive()) - { - if ((creature instanceof PlayerInstance) || (creature instanceof Summon)) - { - // Signets are a special case, casted on target_self but don't harm self - if ((skill.getSkillType() != SkillType.SIGNET) && (skill.getSkillType() != SkillType.SIGNET_CASTTIME)) - { - creature.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, activeChar); - activeChar.updatePvPStatus(creature); - } - } - else if (creature instanceof Attackable) - { - switch (skill.getSkillType()) - { - case AGGREDUCE: - case AGGREDUCE_CHAR: - case AGGREMOVE: - { - break; - } - default: - { - ((Creature) target).addAttackerToAttackByList(this); - int hitTime = Formulas.getInstance().calcMAtkSpd(activeChar, skill, skill.getHitTime()); - if ((checkBss() || checkSps()) && !skill.isStaticHitTime() && !skill.isPotion() && skill.isMagic()) - { - hitTime = (int) (0.70 * hitTime); - } - ThreadPool.schedule(new notifyAiTaskDelayed(CtrlEvent.EVT_ATTACKED, this, target), hitTime); - break; - } - } - } - } - else if (creature instanceof PlayerInstance) - { - // Casting non offensive skill on player with pvp flag set or with karma - if (!creature.equals(this) && ((((PlayerInstance) creature).getPvpFlag() > 0) || (((PlayerInstance) creature).getKarma() > 0))) - { - activeChar.updatePvPStatus(); - } - } - else if ((creature instanceof Attackable) && (skill.getSkillType() != SkillType.SUMMON) && (skill.getSkillType() != SkillType.BEAST_FEED) && (skill.getSkillType() != SkillType.UNLOCK) && (skill.getSkillType() != SkillType.DELUXE_KEY_UNLOCK)) - { - activeChar.updatePvPStatus(this); - } - } - } - if (target instanceof MonsterInstance) - { - if (!skill.isOffensive() && (skill.getSkillType() != SkillType.UNLOCK) && (skill.getSkillType() != SkillType.SUMMON) && (skill.getSkillType() != SkillType.DELUXE_KEY_UNLOCK) && (skill.getSkillType() != SkillType.BEAST_FEED)) - { - PlayerInstance activeChar = null; - if (this instanceof PlayerInstance) - { - activeChar = (PlayerInstance) this; - activeChar.updatePvPStatus(activeChar); - } - else if (this instanceof Summon) - { - activeChar = ((Summon) this).getOwner(); - } - } } } - - ISkillHandler handler = null; - // Check if the skill effects are already in progress on the Creature - if (skill.isToggle() && (getFirstEffect(skill.getId()) != null)) - { - handler = SkillHandler.getInstance().getSkillHandler(skill.getSkillType()); - if (handler != null) - { - handler.useSkill(this, skill, targets); - } - else - { - skill.useSkill(this, targets); - } - return; - } - - // Check if over-hit is possible - if (skill.isOverhit()) - { - // Set the "over-hit enabled" flag on each of the possible targets - for (WorldObject target : targets) - { - final Creature creature = (Creature) target; - if (creature instanceof Attackable) - { - ((Attackable) creature).overhitEnabled(true); - } - } - } - - // Get the skill handler corresponding to the skill type (PDAM, MDAM, SWEEP...) started in gameserver + } + + ISkillHandler handler = null; + // Check if the skill effects are already in progress on the Creature + if (skill.isToggle() && (getFirstEffect(skill.getId()) != null)) + { handler = SkillHandler.getInstance().getSkillHandler(skill.getSkillType()); - - // Launch the magic skill and calculate its effects if (handler != null) { handler.useSkill(this, skill, targets); @@ -8118,44 +8089,72 @@ public abstract class Creature extends WorldObject implements ISkillsHolder { skill.useSkill(this, targets); } - - // if the skill is a potion, must delete the potion item - if (skill.isPotion() && (this instanceof Playable)) + return; + } + + // Check if over-hit is possible + if (skill.isOverhit()) + { + // Set the "over-hit enabled" flag on each of the possible targets + for (WorldObject target : targets) { - Potions.deletePotionItem((Playable) this, skill.getId(), skill.getLevel()); - } - - if ((this instanceof PlayerInstance) || (this instanceof Summon)) - { - final PlayerInstance caster = this instanceof PlayerInstance ? (PlayerInstance) this : ((Summon) this).getOwner(); - for (WorldObject target : targets) + final Creature creature = (Creature) target; + if (creature instanceof Attackable) { - if (target instanceof NpcInstance) + ((Attackable) creature).overhitEnabled(true); + } + } + } + + // Get the skill handler corresponding to the skill type (PDAM, MDAM, SWEEP...) started in gameserver + handler = SkillHandler.getInstance().getSkillHandler(skill.getSkillType()); + + // Launch the magic skill and calculate its effects + if (handler != null) + { + handler.useSkill(this, skill, targets); + } + else + { + skill.useSkill(this, targets); + } + + // if the skill is a potion, must delete the potion item + if (skill.isPotion() && (this instanceof Playable)) + { + Potions.deletePotionItem((Playable) this, skill.getId(), skill.getLevel()); + } + + if ((this instanceof PlayerInstance) || (this instanceof Summon)) + { + final PlayerInstance caster = this instanceof PlayerInstance ? (PlayerInstance) this : ((Summon) this).getOwner(); + for (WorldObject target : targets) + { + if (target instanceof NpcInstance) + { + final NpcInstance npc = (NpcInstance) target; + for (Quest quest : npc.getTemplate().getEventQuests(EventType.ON_SKILL_USE)) { - final NpcInstance npc = (NpcInstance) target; - for (Quest quest : npc.getTemplate().getEventQuests(EventType.ON_SKILL_USE)) - { - quest.notifySkillUse(npc, caster, skill); - } + quest.notifySkillUse(npc, caster, skill); } } - - if (skill.getAggroPoints() > 0) + } + + if (skill.getAggroPoints() > 0) + { + for (WorldObject spMob : caster.getKnownList().getKnownObjects().values()) { - for (WorldObject spMob : caster.getKnownList().getKnownObjects().values()) + if (spMob instanceof NpcInstance) { - if (spMob instanceof NpcInstance) + final NpcInstance npcMob = (NpcInstance) spMob; + if (npcMob.isInsideRadius(caster, 1000, true, true) && npcMob.hasAI() && (npcMob.getAI().getIntention() == AI_INTENTION_ATTACK)) { - final NpcInstance npcMob = (NpcInstance) spMob; - if (npcMob.isInsideRadius(caster, 1000, true, true) && npcMob.hasAI() && (npcMob.getAI().getIntention() == AI_INTENTION_ATTACK)) + final WorldObject npcTarget = npcMob.getTarget(); + for (WorldObject target : targets) { - final WorldObject npcTarget = npcMob.getTarget(); - for (WorldObject target : targets) + if ((npcTarget == target) || (npcMob == target)) { - if ((npcTarget == target) || (npcMob == target)) - { - npcMob.seeSpell(caster, target, skill); - } + npcMob.seeSpell(caster, target, skill); } } } @@ -8163,10 +8162,11 @@ public abstract class Creature extends WorldObject implements ISkillsHolder } } } - catch (Exception e) - { - LOGGER.warning(e.getMessage()); - } + // } + // catch (Exception e) + // { + // LOGGER.warning(e.getMessage()); + // } } /** diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/knownlist/WorldObjectKnownList.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/knownlist/WorldObjectKnownList.java index 65de9f8507..7a0cef0bad 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/knownlist/WorldObjectKnownList.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/knownlist/WorldObjectKnownList.java @@ -141,9 +141,9 @@ public class WorldObjectKnownList else { // Go through all visible WorldObject near the Creature - for (WorldObject playable : World.getInstance().getVisiblePlayers(_activeObject)) + for (WorldObject object : World.getInstance().getVisibleObjects(_activeObject)) { - if (playable == null) + if ((object == null) || !object.isPlayable()) { return; } @@ -151,7 +151,7 @@ public class WorldObjectKnownList // Try to add object to active object's known objects // Creature only needs to see visible PlayerInstance and PlayableInstance, when moving. Other creatures are currently only known from initial spawn area. // Possibly look into getDistanceToForgetObject values before modifying this approach... - addKnownObject(playable); + addKnownObject(object); } } } diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/items/Weapon.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/items/Weapon.java index 26f4b66fcb..94f97a8a87 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/items/Weapon.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/items/Weapon.java @@ -16,7 +16,6 @@ */ package org.l2jmobius.gameserver.model.items; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -404,36 +403,36 @@ public class Weapon extends Item continue; // Skill condition not met } - try + // try + // { + // Get the skill handler corresponding to the skill type + final ISkillHandler handler = SkillHandler.getInstance().getSkillHandler(skill.getSkillType()); + final List targets = new ArrayList<>(); + targets.add(target); + + // Launch the magic skill and calculate its effects + if (handler != null) { - // Get the skill handler corresponding to the skill type - final ISkillHandler handler = SkillHandler.getInstance().getSkillHandler(skill.getSkillType()); - final List targets = new ArrayList<>(); - targets.add(target); - - // Launch the magic skill and calculate its effects - if (handler != null) - { - handler.useSkill(caster, skill, targets); - } - else - { - skill.useSkill(caster, targets); - } - - if ((caster instanceof PlayerInstance) && (target instanceof NpcInstance)) - { - for (Quest quest : ((NpcInstance) target).getTemplate().getEventQuests(EventType.ON_SKILL_USE)) - { - quest.notifySkillUse((NpcInstance) target, (PlayerInstance) caster, skill); - } - } - - output = true; + handler.useSkill(caster, skill, targets); } - catch (IOException e) + else { + skill.useSkill(caster, targets); } + + if ((caster instanceof PlayerInstance) && (target instanceof NpcInstance)) + { + for (Quest quest : ((NpcInstance) target).getTemplate().getEventQuests(EventType.ON_SKILL_USE)) + { + quest.notifySkillUse((NpcInstance) target, (PlayerInstance) caster, skill); + } + } + + output = true; + // } + // catch (IOException e) + // { + // } } return output; diff --git a/L2J_Mobius_CT_2.4_Epilogue/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_CT_2.4_Epilogue/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_CT_2.4_Epilogue/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/World.java index 691c951a8e..afcf03b889 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/World.java @@ -402,10 +402,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -462,15 +465,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -518,15 +525,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; - } + } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceId() != object.getInstanceId())) { continue; @@ -606,27 +617,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceId() != object.getInstanceId()) + if (wo.getInstanceId() != object.getInstanceId()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -658,29 +672,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceId() != object.getInstanceId()) + if (wo.getInstanceId() != object.getInstanceId()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_CT_2.6_HighFive/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_CT_2.6_HighFive/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_CT_2.6_HighFive/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_CT_2.6_HighFive/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/World.java index 691c951a8e..afcf03b889 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/World.java @@ -402,10 +402,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -462,15 +465,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -518,15 +525,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; - } + } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceId() != object.getInstanceId())) { continue; @@ -606,27 +617,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceId() != object.getInstanceId()) + if (wo.getInstanceId() != object.getInstanceId()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -658,29 +672,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceId() != object.getInstanceId()) + if (wo.getInstanceId() != object.getInstanceId()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_Classic_2.0_Saviors/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_Classic_2.0_Saviors/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_Classic_2.0_Saviors/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_Classic_2.1_Zaken/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_Classic_2.1_Zaken/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_Classic_2.1_Zaken/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_Classic_2.2_Antharas/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_Classic_2.2_Antharas/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_Classic_2.2_Antharas/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_Classic_2.3_SevenSigns/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_Classic_2.3_SevenSigns/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_Classic_2.4_SecretOfEmpire/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_Classic_3.0_TheKamael/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_Classic_3.0_TheKamael/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; } diff --git a/L2J_Mobius_Classic_Interlude/.settings/org.eclipse.jdt.ui.prefs b/L2J_Mobius_Classic_Interlude/.settings/org.eclipse.jdt.ui.prefs index e507d1b74f..182ae03900 100644 --- a/L2J_Mobius_Classic_Interlude/.settings/org.eclipse.jdt.ui.prefs +++ b/L2J_Mobius_Classic_Interlude/.settings/org.eclipse.jdt.ui.prefs @@ -94,7 +94,7 @@ sp_cleanup.always_use_parentheses_in_expressions=true sp_cleanup.always_use_this_for_non_static_field_access=false sp_cleanup.always_use_this_for_non_static_method_access=false sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.convert_to_enhanced_for_loop=false sp_cleanup.correct_indentation=false sp_cleanup.format_source_code=true sp_cleanup.format_source_code_changes_only=false @@ -106,18 +106,23 @@ sp_cleanup.make_type_abstract_if_missing_method=false sp_cleanup.make_variable_declarations_final=true sp_cleanup.never_use_blocks=false sp_cleanup.never_use_parentheses_in_expressions=false +sp_cleanup.number_suffix=false sp_cleanup.on_save_use_additional_actions=true sp_cleanup.organize_imports=true +sp_cleanup.push_down_negation=false sp_cleanup.qualify_static_field_accesses_with_declaring_class=false sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true sp_cleanup.qualify_static_member_accesses_with_declaring_class=true sp_cleanup.qualify_static_method_accesses_with_declaring_class=false sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_array_creation=false sp_cleanup.remove_unnecessary_casts=true sp_cleanup.remove_unnecessary_nls_tags=true sp_cleanup.remove_unused_imports=true @@ -126,11 +131,14 @@ sp_cleanup.remove_unused_private_fields=true sp_cleanup.remove_unused_private_members=false sp_cleanup.remove_unused_private_methods=true sp_cleanup.remove_unused_private_types=true +sp_cleanup.simplify_lambda_expression_and_method_ref=false sp_cleanup.sort_members=false sp_cleanup.sort_members_all=false sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_autoboxing=false sp_cleanup.use_blocks=true sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_directly_map_method=false sp_cleanup.use_lambda=true sp_cleanup.use_parentheses_in_expressions=true sp_cleanup.use_this_for_non_static_field_access=false @@ -138,3 +146,4 @@ sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true sp_cleanup.use_this_for_non_static_method_access=false sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true sp_cleanup.use_type_arguments=false +sp_cleanup.use_unboxing=false diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/World.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/World.java index 5a8f963229..2944adf36a 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/World.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/World.java @@ -406,10 +406,13 @@ public class World oldRegion.removeVisibleObject(object); // Go through all surrounding WorldRegion Creatures - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -466,15 +469,19 @@ public class World return; } - for (WorldRegion worldRegion : oldRegion.getSurroundingRegions()) + final WorldRegion[] oldSurroundingRegions = oldRegion.getSurroundingRegions(); + for (int i = 0; i < oldSurroundingRegions.length; i++) { + final WorldRegion worldRegion = oldSurroundingRegions[i]; if (newRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if (wo == object) { continue; @@ -522,15 +529,19 @@ public class World } } - for (WorldRegion worldRegion : newRegion.getSurroundingRegions()) + final WorldRegion[] newSurroundingRegions = newRegion.getSurroundingRegions(); + for (int i = 0; i < newSurroundingRegions.length; i++) { + final WorldRegion worldRegion = newSurroundingRegions[i]; if (oldRegion.isSurroundingRegion(worldRegion)) { continue; } - for (WorldObject wo : worldRegion.getVisibleObjects().values()) + final List visibleObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { + final WorldObject wo = visibleObjects.get(j); if ((wo == object) || (wo.getInstanceWorld() != object.getInstanceWorld())) { continue; @@ -610,27 +621,30 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } @@ -662,29 +676,32 @@ public class World return; } - final WorldRegion centerWorldRegion = getRegion(object); - if (centerWorldRegion == null) + final WorldRegion worldRegion = getRegion(object); + if (worldRegion == null) { return; } - for (WorldRegion region : centerWorldRegion.getSurroundingRegions()) + final WorldRegion[] surroundingRegions = worldRegion.getSurroundingRegions(); + for (int i = 0; i < surroundingRegions.length; i++) { - for (WorldObject visibleObject : region.getVisibleObjects().values()) + final List visibleObjects = surroundingRegions[i].getVisibleObjects(); + for (int j = 0; j < visibleObjects.size(); j++) { - if ((visibleObject == null) || (visibleObject == object) || !clazz.isInstance(visibleObject)) + final WorldObject wo = visibleObjects.get(j); + if ((wo == null) || (wo == object) || !clazz.isInstance(wo)) { continue; } - if (visibleObject.getInstanceWorld() != object.getInstanceWorld()) + if (wo.getInstanceWorld() != object.getInstanceWorld()) { continue; } - if (visibleObject.calculateDistance3D(object) <= range) + if (wo.calculateDistance3D(object) <= range) { - c.accept(clazz.cast(visibleObject)); + c.accept(clazz.cast(wo)); } } } diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/WorldRegion.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/WorldRegion.java index 25ada44e59..ba6534608a 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/WorldRegion.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/WorldRegion.java @@ -16,8 +16,8 @@ */ package org.l2jmobius.gameserver.model; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ScheduledFuture; import org.l2jmobius.Config; @@ -28,9 +28,9 @@ import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; public class WorldRegion { - /** Map containing visible objects in this world region. */ - private final Map _visibleObjects = new ConcurrentHashMap<>(); - /** Map containing nearby regions forming this world region's effective area. */ + /** List containing visible objects in this world region. */ + private final List _visibleObjects = new ArrayList<>(); + /** Array containing nearby regions forming this world region's effective area. */ private WorldRegion[] _surroundingRegions; private final int _regionX; private final int _regionY; @@ -52,8 +52,9 @@ public class WorldRegion if (!isOn) { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { final Attackable mob = (Attackable) wo; @@ -87,15 +88,16 @@ public class WorldRegion } else { - for (WorldObject wo : _visibleObjects.values()) + for (int i = 0; i < _visibleObjects.size(); i++) { + final WorldObject wo = _visibleObjects.get(i); if (wo.isAttackable()) { // Start HP/MP/CP regeneration task. ((Attackable) wo).getStatus().startHpMpRegeneration(); RandomAnimationTaskManager.getInstance().add((Npc) wo); } - else if (wo instanceof Npc) + else if (wo.isNpc()) { RandomAnimationTaskManager.getInstance().add((Npc) wo); } @@ -110,11 +112,19 @@ public class WorldRegion public boolean areNeighborsEmpty() { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - if (worldRegion.isActive() && worldRegion.getVisibleObjects().values().stream().anyMatch(WorldObject::isPlayable)) + final WorldRegion worldRegion = _surroundingRegions[i]; + if (worldRegion.isActive()) { - return false; + final List regionObjects = worldRegion.getVisibleObjects(); + for (int j = 0; j < regionObjects.size(); j++) + { + if (regionObjects.get(j).isPlayable()) + { + return false; + } + } } } return true; @@ -157,9 +167,9 @@ public class WorldRegion // Then, set a timer to activate the neighbors. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { - worldRegion.setActive(true); + _surroundingRegions[i].setActive(true); } }, 1000 * Config.GRID_NEIGHBOR_TURNON_TIME); } @@ -183,8 +193,9 @@ public class WorldRegion // Suggest means: first check if a neighbor has PlayerInstances in it. If not, deactivate. _neighborsTask = ThreadPool.schedule(() -> { - for (WorldRegion worldRegion : _surroundingRegions) + for (int i = 0; i < _surroundingRegions.length; i++) { + final WorldRegion worldRegion = _surroundingRegions[i]; if (worldRegion.areNeighborsEmpty()) { worldRegion.setActive(false); @@ -206,7 +217,13 @@ public class WorldRegion return; } - _visibleObjects.put(object.getObjectId(), object); + synchronized (_visibleObjects) + { + if (!_visibleObjects.contains(object)) + { + _visibleObjects.add(object); + } + } // If this is the first player to enter the region, activate self and neighbors. if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) @@ -230,7 +247,11 @@ public class WorldRegion { return; } - _visibleObjects.remove(object.getObjectId()); + + synchronized (_visibleObjects) + { + _visibleObjects.remove(object); + } if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) { @@ -238,7 +259,7 @@ public class WorldRegion } } - public Map getVisibleObjects() + public List getVisibleObjects() { return _visibleObjects; }